2015-11-27 3 views
1

У меня есть служба RESTful через HTTPS с базовой аутентификацией. Я могу потреблять его, используя ниже код в «нормальном» Консоль для Windows приложения:Использовать базовую услугу WCF REST в Xamarin с помощью System.ServiceModel

 var uri = "https://example.com/service"; 
     var binding = new WebHttpBinding(); 
     binding.Security.Transport = new HttpTransportSecurity(); 
     binding.Security.Mode = WebHttpSecurityMode.Transport; 
     binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic; 
     var factory = new ChannelFactory<IService>(binding, uri); 
     factory.Endpoint.Behaviors.Add(new WebHttpBehavior()); 
     factory.Credentials.UserName.UserName = "user"; 
     factory.Credentials.UserName.Password = "password"; 
     factory.Open(); 
     IService service = factory.CreateChannel(); 
     service.SomeMethod(); 

Но когда я использую точно такой же код в приложении Xamarin Android я получаю WebException:

Был ошибку на запрос веб-обработка: код состояния 401 (Несанкционированное): Несанкционированное

Я новичок в Xamarin, но, насколько я знаю, реализация ServiceModel такая же, как и в Silverlight.

Пожалуйста, помогите mi решить эту проблему.

ответ

1

По-видимому, это не может быть сделано с использованием этого API. Вот почему binding.Security.Transport is null после создания WebHttpBinding в приложении Xamarin/Android (это не null в «обычном» приложении консоли).

Решение состоит в том, чтобы использовать низкий уровень HttpWebRequest:

public void GetDataFromRestService() 
    { 
     var request = HttpWebRequest.Create("https://example.com/service/SomeMethod"); 
     SetBasicAuthHeader(request, "user", "password"); 

     request.ContentType = "application/json"; 
     request.Method = "GET"; 

     using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
     { 
      if (response.StatusCode != HttpStatusCode.OK) 
      { 
       Console.Out.WriteLine("ERROR: Server status code: {0}", response.StatusCode); 
      } 
      using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
      { 
       var content = reader.ReadToEnd(); 
       if (string.IsNullOrWhiteSpace(content)) 
       { 
        Console.Out.WriteLine("ERROR: Empty response."); 
       } 
       else 
       { 
        Console.Out.WriteLine("Response: {0}", content); 
       } 
      } 
     } 
    } 

    public void SetBasicAuthHeader(WebRequest request, String userName, String userPassword) 
    { 
     string authInfo = userName + ":" + userPassword; 
     authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); 
     request.Headers["Authorization"] = "Basic " + authInfo; 
    } 

После того, что нам нужно вручную разобрать возвращаемое содержимое JSON (есть Json.NET для Xamarin). Или мы можем использовать некоторую библиотеку, такую ​​как RestSharp, которая также доступна для Xamarin и упрощает работу.

Смежные вопросы