如何在一个带有android的pcl中使用HttpClient与NTLM一起工作

时间:2017-06-22 16:46:45

标签: xamarin.android xamarin.forms httpclient

在pcl中使用以下适用于Win10手机的内容。 但是我无法获得相同的代码,以便在使用android 7.0的samsung s7上返回OK 项目是xamarin形式。 system.net.http的nuget是2.2.29。 我在UWP中为win10手机和android项目添加了相同的nuget。 我还更改了用户,包括"域\用户","域@用户","用户@域"

var httpClientHandler = new System.Net.Http.HttpClientHandler()
{
    Credentials = credentials.GetCredential(new Uri(location), "NTLM")
};

我已尝试过替代设置httpClientHandler.Credentials。

var credentials = new NetworkCredentials("user", "pass", "domain");
var location = "http://apps.mysite.com/api#/doit";
var httpClientHandler = new HttpClientHandler{
    Credentials = credentials
}
using (var httpClient = new HttpClient(httpClientHandler, true))
{
    httpClient.DefaultRequestHeaders.Accept.Clear();
    httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
    httpClient.DefaultRequestHeaders.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f");
    try
    {
        var httpResponseMessage = await httpClient.GetAsync(location);
            if (httpResponseMessage.StatusCode != System.Net.HttpStatusCode.OK)
            {
                //handle error
            }
            else
            {
               //do something
            }
    }
    catch (Exception)
    {}
    finally
    {}

}
另一个奇怪的事情。当我在android上运行它时,代码命中等待httpclient.getasync(location); 并立即跳到最后。

我有一个简单的用户名和表格形式密码输入字段,以及确定按钮。 所有三个控件都绑定到视图模型。通过ICommand的OK按钮。

此代码和视图存在于PCL中。其中引用了Microsoft.Net.Http。 我有Android和Universal Windows Xamarin构建使用PCL的构建。

Android属性。默认httpClient,SSL / TLS默认值。支持拱armeabi,armeabi-v7a; x86

Android Manifest:相机,手电筒和互联网

private bool calcEnabled = false;
private ICommand okCommand;
private string message = string.Empty;
private string validatingMessage = "Validating!";
private string unauthorizedMessage = "Invalid Credentials!";
private string authenticatedMessage = "Validated";
private bool validating = false;
public ICommand OkCommand => okCommand ?? (okCommand = new Command<object>((o) => clicked(o), (o) => CalcEnabled));

protected async void clicked(object state)
{
    try
    {
        Validating = true;
        Message = validatingMessage;
        var credentials = new 
        System.Net.NetworkCredential(Helpers.Settings.UserName, Helpers.Settings.Password, "www.domain.com");
        var location = "http://apps.wwwoodproducts.com/wwlocator#/information";
        var httpClientHandler = new System.Net.Http.HttpClientHandler()
        {
            Credentials = credentials.GetCredential(new Uri(location), "NTLM")     };

        using (var httpClient = new System.Net.Http.HttpClient(httpClientHandler))
        {
            httpClient.DefaultRequestHeaders.Accept.Clear();
            httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
            httpClient.DefaultRequestHeaders.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f");
            try
            {
                var httpResponseMessage = await 
                httpClient.GetAsync(location);

                if (httpResponseMessage.StatusCode != System.Net.HttpStatusCode.OK)
                {
                    Message = unauthorizedMessage;
                }
                else
                {
                    Message = authenticatedMessage;
                    Messenger.Default.Send<bool>(true);
                }
            }
            catch (Exception)
            {
                Message = unauthorizedMessage;
            }
            finally
            {
                Validating = false;
            }
        }
    }
    catch (Exception)
    {
        throw;
    }
}

0 个答案:

没有答案