SignalR добавить header для Forms авторизации

Если у вас на сервере настроение Froms авторизация, а вы из клиента пытаетесь подключиться к сервису то обычно нужно добавить в заголовок запроса авторотационные Cookies.
Как это сделать
1. На сервере в Hub добавить авторизацию:

[Authorize]
[HubName("MyTestHub")]
public class TestHub : Hub
{
public TestHub()
{
int a = 5;
}
}

2. Каким-то образом получить заголовок авторизации
http://acroblog.acrovations.com/post/2013/03/22/Forms-авторизация-WCF-Data-Service.aspx
например как тут, в функции GetCookie

var hub = new HubConnection("http://localhost:5555/signalr");
hub.CookieContainer = new CookieContainer();
hub.CookieContainer.SetCookies(new Uri("http://localhost:5555/"), MyCookieHeader.Cookie);
var x = hub.CookieContainer.GetCookieHeader(new Uri("http://localhost:5555/"));
var cook = new Cookie("test", "test");
cook.Domain = "localhost";
cook.Path = "/";
hub.CookieContainer.Add(cook);
proxy = hub.CreateHubProxy("MyTestHub");
hub.Start().Wait();

все.
Главное добавить какой-то cookie чтобы было с чем заголовок отправлять.

MVVM Command Pattern

public ICommand CommandName { get; set; }
private void CommandExecutedLogic(object param)
{
// Do Some
}
private bool CanExecutedLogic(object param)
{
return param != null;
}


В конструкторе:

this.CommandName = new DelegateCommand(this.
CommandExecutedLogic, this. CanExecutedLogic);

WCF Data Services и Composite Key и Telerik Open Access ORM (OData V3)

Если вы используете связи многие-ко-многим (many-to-many) с помощю составных ключей:

CREATE TABLE ClientInGroup
(
ClientID bigint foreign key references Client(ID) not null, 
ClientGroupID bigint foreign key references ClientGroup(ID) not null, 
PRIMARY KEY  
(
ClientID,
ClientGroupID 
)
)

И решили использовать WCF Data Service то можете столкнуться с проблемой когда вы не можете обновить связанные записи.
Для решение этой досадной проблемы нужно сделать вот чего:

На сервер в сгенерированном телериком файле OpenAccessUpdateProvider найти функцию GetNavigationalMember и добавить туда строку navigationProperty.IsManaged = true;

private MetaNavigationMember GetNavigationalMember(string propertyName, string className)
{
MetaNavigationMember navigationProperty = this.GetMember(propertyName, className) as MetaNavigationMember;
navigationProperty.IsManaged = true;
if (navigationProperty.Association is MetaJoinTableAssociation && !navigationProperty.IsManaged)
{
string exceptionMessage = string.Format("Change made on property {0} of type {1} that has IsManaged set to False will not be persisted.",
navigationProperty.PropertyName, navigationProperty.DeclaringType.FullName);
throw new InvalidOperationException(exceptionMessage);
}
return navigationProperty;
}

После этого все будет работать. И в вашем приложении вы можете спокойно связывать данные

dataModel.AddLink(CurrentSportSection, "Venues", item);


или

dataModel.DeleteLink(CurrentSportSection, "Venues", item);

 

WPF Data Service V2 в место V3

В процессе генерации прокси класа для WCF Data Service Visual Studio бывает указывает версию V2 в место V3.
Чтоб это исправить нужно найти класс сервиса и немного поменять конструктор:

[System.CodeDom.Compiler.GeneratedCodeAttribute ("System.Data.Services.Design", "1.0.0")]
public MyDataBaseService (global :: System.Uri serviceRoot):
base (serviceRoot, System.Data.Services.Common.DataServiceProtocolVersion.V3)
{
this.ResolveName = new global :: System.Func <global::System.Type, string> (this.ResolveNameFromType);
this.ResolveType = new global :: System.Func <string, global::System.Type> (this.ResolveTypeFromName);
this.OnContextCreated ();
}

В базовый конструктор нужно добавить System.Data.Services.Common.DataServiceProtocolVersion.V3 – что укажет что мы используем протокол версии V3.

Хотя после последнего обновления, данные манипуляции ненужны.

Forms авторизация WCF Data Service

Для того чтобы поддерживать авторизацию для доступа к WCF Data Service  с помощю Forms вам нужно собственно настроить эту авторизацию на сервере.

<system.web>
<authentic.ation mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" requireSSL="false" />
</authentication>
</system.web>

Убедиться что все верно работает.
Далее нужно включить сервис авторизации. Это делетьс в web.config

<system.web.extensions>
<scripting>
<webServices>
<authenticationService enabled="true" requireSSL="false" />
</webServices>
</scripting>
</system.web.extensions>

Далее в клиенте нужно написать расширение для класса сервиса:

using System;
using System.Data.Services.Client;
using System.IO;
using System.Linq;
using System.Net;
using System.Security;
using My.Helper;
namespace My.MySportDataBaseService
{
public partial class MySportDataBase
{
partial void OnContextCreated()
{
this.SendingRequest +=
new EventHandler<SendingRequestEventArgs>(OnSendingRequestManualCookies);
}
void OnSendingRequestManualCookies(object sender, SendingRequestEventArgs e)
{
try
{
NetworkCredential creds = this.Credentials as NetworkCredential;
string cookie = this.GetCookie(creds.UserName, creds.Password);
e.RequestHeaders.Add("Cookie", cookie);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
}
private string GetCookie(string userName, string password)
{
if (MyParameters.Cookie == null)
{
string loginUri = string.Format("{0}/{1}/{2}",
string.Format("http://{0}", MyParameters.ServerName),
"Authentication_JSON_AppService.axd",
"Login");
WebRequest request = HttpWebRequest.Create(loginUri);
request.Method = "POST";
request.ContentType = "application/json";
string authBody = String.Format(
"{{ \"userName\": \"{0}\", \"password\": \"{1}\", \"createPersistentCookie\":false}}",
userName,
password);
request.ContentLength = authBody.Length;
StreamWriter w = new StreamWriter(request.GetRequestStream());
w.Write(authBody);
w.Close();
WebResponse res = request.GetResponse();
if (res.Headers["Set-Cookie"] != null)
{
MyParameters.Cookie = res.Headers["Set-Cookie"];
}
else
{
throw new SecurityException("Invalid username and password");
}
}
return MyParameters.Cookie; 
}
}
}

Главное хранить где-то cookies авторизации чтобы постоянно не тратить время повторно на авторизацию

Ну и использовать указывая логин и пароль в NetworkCredential:

this.dataModel = new MySportDataBaseService.MySportDataBaseService(MyParameters.ConnectionString);
this.dataModel.Credentials = new System.Net.NetworkCredential(MyParameters.Login, MyParameters.Password);

 

http://blogs.msdn.com/b/astoriateam/archive/2010/07/21/odata-and-authentication-part-7-forms-authentication.aspx

как поменять Authentication_JSON_AppService.axd  - http://msdn.microsoft.com/....

Unable to activate windows store app

Иногда может возникнуть проблема при заупске приложение Windows Store App типа "Unable to activate windows store app"

Для того чтобы починить нужно удалить содержимое папки bin и перекомпилировать приложение