2010-05-04 7 views
0

Я пытаюсь создать прокси-сервер REST-клиента программно на C#, используя следующий код, но я продолжаю получать ошибку CommunicationException. Я что-то упускаю?Создайте клиентский прокси-сервер WCF программно (в C#)

public static class WebProxyFactory 
{ 
    public static T Create<T>(string url) where T : class 
    { 
     ServicePointManager.Expect100Continue = false; 
     WebHttpBinding binding = new WebHttpBinding(); 

     binding.MaxReceivedMessageSize = 1000000; 

     WebChannelFactory<T> factory = 
      new WebChannelFactory<T>(binding, new Uri(url)); 

     T proxy = factory.CreateChannel(); 

     return proxy; 
    } 

    public static T Create<T>(string url, string userName, string password) 
     where T : class 
    { 
     ServicePointManager.Expect100Continue = false; 
     WebHttpBinding binding = new WebHttpBinding(); 

     binding.Security.Mode = 
      WebHttpSecurityMode.TransportCredentialOnly; 
     binding.Security.Transport.ClientCredentialType = 
      HttpClientCredentialType.Basic; 
     binding.UseDefaultWebProxy = false; 

     binding.MaxReceivedMessageSize = 1000000; 

     WebChannelFactory<T> factory = 
      new WebChannelFactory<T>(binding, new Uri(url)); 

     ClientCredentials credentials = factory.Credentials; 
     credentials.UserName.UserName = userName; 
     credentials.UserName.Password = password; 

     T proxy = factory.CreateChannel(); 

     return proxy; 
    } 
} 

Так что я могу использовать его следующим образом:

IMyRestService proxy = WebProxyFactory.Create<IMyRestService>(url, usr, pwd); 
var result = proxy.GetSomthing(); // Fails right here 
+1

Я не Пока еще не понятно, почему, но в другом вопросе проблема заключалась в добавлении webhttpbinding к заводским настройкам конечной точки: factory.Endpoint.Behaviors.Add (новый WebHttpBehavior()); –

+0

Это тоже не сработало. Любые другие предложения? – Tawani

ответ

0

Для этого, чтобы работать с формами проверки подлинности, я должен был физически переопределить заголовки аутентификации следующим образом:

var proxy = WebProxyFactory.Create<ITitleWorldService>(url, userName, password); 

using (new OperationContextScope((IContextChannel)proxy)) 
{ 
    var authorizationToken = GetBasicAuthorizationToken(userName, password); 
    var httpRequestProperty = new HttpRequestMessageProperty(); 
    httpRequestProperty.Headers[System.Net.HttpRequestHeader.Authorization] = authorizationToken; 
    OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty; 

    //var response = proxy.DoWork();  
    Console.WriteLine(proxy.SayHello()); 
}