![](/img/trans.png)
[英]Generating the System.ServiceModel configuration section for WCF Data Service client
[英]Consume WCF REST basic auth service in Xamarin using System.ServiceModel
我通過HTTPS啟用了RESTful服務並啟用了基本身份驗證。 我可以在“正常” Windows控制台應用程序中使用以下代碼來使用它:
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:
處理Web請求時出錯:狀態碼401(未經授權):未經授權
我是Xamarin的新手,但據我所知,ServiceModel實現與Silverlight中的相同。
請幫助mi解決此問題。
顯然,使用此API無法完成。 這就是為什么binding.Security.Transport
是創建后空 WebHttpBinding
在Xamarin / Android應用(它不是在“正常”的控制台應用程序無效 )。
解決方案是使用低級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內容(Xamarin有Json.NET)。 或者,我們可以使用諸如RestSharp之類的庫 ,該庫也可用於Xamarin並使事情變得更容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.