0

我正在使用C#Xamarin for Visual Studio 2015 v4.2.2.11(Xamarin.forms Portable project)。 我试图解决一个需要身份验证的Web服务,但不断收到401未授权。Xamarin带有凭证的Android SOAP webservice返回401未授权

该webservice是Navision codeunit发布为web服务。它接受请求XML并返回响应XML。 我对许多项目都使用过这种方式,从来没有认证问题。以前的项目有.Net Windows,UWP,Windows mobile,Windows CE(紧凑框架)以及最近用WinDev编写的一些项目,我使用了相同的通信。

webservice需要以networkcredential(user,pwd,domain)形式进行身份验证。 在UWP项目中,我可以添加服务引用并以此方式进行身份验证。这就像一个魅力! 在Droid和iOS项目中,我无法添加服务参考,因此我不得不使用Web参考。 Web引用对象确实有一个属性Credentials,但似乎没有实现?

从Android模拟器中,我可以浏览到默认的服务器页面,但是当我尝试浏览到web服务时,浏览器还返回401未授权,无需登录或认证的问题。 在Windows 10手机模拟器上,我可以浏览到web服务页面,浏览器询问我的凭据。

由于UWP项目使用服务引用并且不能使用Web引用,并且Android和iOS项目都使用Web引用并且不能使用服务引用,所以我必须将Web服务连接拉到平台项目。

我有一个SoapService类,我声明webservice为DynamicsNAV,服务本身称为serviceHandler,要执行的操作称为ProcessRequests。

public class SoapService : ISoapService 
    { 
    DynamicsNAV.WebServiceHandler_PortClient serviceHandler; 
     string soapURL = "http://192.168.7.101:7047/DynamicsNAV90/WS/CRONUS%20BELGI%C3%8B%20NV/Codeunit/WebServiceHandler"; 
    public SoapService() 
     { 
      serviceHandler = new DynamicsNAV.WebServiceHandler(); 
      serviceHandler.Url = soapURL; 
      NetworkCredential nc = new NetworkCredential("wd", "wd", "VMNAV2016"); 
      serviceHandler.Credentials = nc; 
      serviceHandler.PreAuthenticate = true; 
     } 
    ... 

在SoapService,我有公共职能GetDataAsync,我所说的互联网服务和多种方式都试过,都返回401 ... 尝试1:

serviceHandler.ProcessRequests(request, ref response); 

异常抛出:的StatusCode = System.Net.HttpStatusCode.Unauthorized

尝试2:

serviceHandler.ProcessRequestsAsync(request, response); 
serviceHandler.ProcessRequestsCompleted += ServiceHandler_ProcessRequestsCompleted; 

抛出异常:的StatusCode = System.Net.HttpStatusCode.Unauthorized

尝试3:

HttpWebRequest req = HttpWebRequest.CreateHttp(soapURL); 
req.Method = "POST"; 
req.PreAuthenticate = true; 
req.Credentials = new NetworkCredential("wd", "wd", "VMNAV2016"); 
byte[] postBytes = Encoding.ASCII.GetBytes(request); 
req.ContentLength = postBytes.Length; 
Stream postStream = req.GetRequestStream(); 
postStream.Write(postBytes, 0, request.Length); 
postStream.Close(); 
WebResponse resp = req.GetResponse(); 
if (resp.ContentLength > 0) 
{ } 

抛出异常:的StatusCode = System.Net.HttpStatusCode.Unauthorized

... 我尝试过调整Service.cs,但没有任何帮助?!?

任何人都可以帮助我吗?我必须得到这个解决方案或解决方法...

由于提前, 维姆

+0

有你在这里尝试过的方法:[认证RESTful Web服务(https://developer.xamarin.com/guides/xamarin-forms/web-services/authentication/rest/)? –

+0

我试过了,但Navision的webservices是SOAP ...并且身份验证应该是带有代表团的凭证类型窗口?我认为.. 肥皂认证是否有这样的文件? –

回答

0

问题解决了。 我调整了Navision Web服务以接受基本身份验证... 凭据确实发送,因此通信正常工作。

感谢所有帮助过我的人。

维姆