Xamarin.android 如何让HttpClient在带有android的pcl中使用NTLM

Xamarin.android 如何让HttpClient在带有android的pcl中使用NTLM,xamarin.android,xamarin.forms,httpclient,Xamarin.android,Xamarin.forms,Httpclient,在pcl中具有适用于Win10 phone的以下功能。 但我无法获得相同的代码返回OK在三星s7与安卓7.0 项目是xamarin forms。 system.net.http的numet是2.2.29。 我已经在win10手机和android项目的UWP中包含了相同的nuget。 我还将用户更改为“域\用户”domain@user", "user@domain" 我已经尝试了设置httpClientHandler.Credentials的其他方法 var credentials = new N

在pcl中具有适用于Win10 phone的以下功能。 但我无法获得相同的代码返回OK在三星s7与安卓7.0 项目是xamarin forms。 system.net.http的numet是2.2.29。 我已经在win10手机和android项目的UWP中包含了相同的nuget。 我还将用户更改为“域\用户”domain@user", "user@domain"

我已经尝试了设置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上运行这个程序时,代码会点击wait httpclient.getasync(location); 然后马上跳到最后

我有一个简单的表单,有用户名和密码输入字段,还有一个OK按钮。 所有三个控件都绑定到viewmodel。通过图标命令单击OK按钮

此代码和视图位于PCL中。它引用了Microsoft.Net.Http。 我有使用PCL的Android和通用Windows Xamarin表单构建

Android属性。默认httpClient,SSL/TLS默认。支撑拱形臂架,臂架-v7a;x86

Android清单:相机、手电筒和互联网

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;
    }
}
private bool calcEnabled=false;
专用ICommand命令;
私有字符串消息=string.Empty;
私有字符串validatingMessage=“Validating!”;
私有字符串unauthorizedMessage=“无效凭据!”;
私有字符串authenticatedMessage=“已验证”;
私有布尔验证=假;
公共ICommand OkCommand=>OkCommand??(okCommand=新命令((o)=>单击(o),(o)=>CalcEnabled));
已单击受保护的异步无效(对象状态)
{
尝试
{
验证=真;
消息=验证消息;
var凭证=新的
System.Net.NetworkCredential(Helpers.Settings.UserName,Helpers.Settings.Password,“www.domain.com”);
变量位置=”http://apps.wwwoodproducts.com/wwlocator#/information";
var httpClientHandler=new System.Net.Http.httpClientHandler()
{
Credentials=Credentials.GetCredential(新Uri(位置),“NTLM”)};
使用(var httpClient=new System.Net.Http.httpClient(httpClientHandler))
{
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(新的System.Net.Http.Headers.MediaTypeWithQualityHeaderValue(“应用程序/json”));
httpClient.DefaultRequestHeaders.Add(“基于X-FORMS的认证已接受”,“f”);
尝试
{
var httpResponseMessage=wait
httpClient.GetAsync(位置);
if(httpResponseMessage.StatusCode!=System.Net.HttpStatusCode.OK)
{
消息=未经授权的消息;
}
其他的
{
消息=认证消息;
Messenger.Default.Send(true);
}
}
捕获(例外)
{
消息=未经授权的消息;
}
最后
{
验证=假;
}
}
}
捕获(例外)
{
投掷;
}
}

您遇到了什么错误?401 Unauthorized我看不到代码中有任何错误。如果你可以临时创建用户名和密码,我可以试着看看有什么问题。您可以在几小时内删除这些凭据。不幸的是,这不会发生,这在我们的内部网(由它管理)上运行了很多安全措施。不管怎样,谢谢。我会看看是否能得到更多的错误信息
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;
    }
}