簡體   English   中英

使用System.ServiceModel在Xamarin中使用WCF REST基本身份驗證服務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM