我想引用一个Web服务,它需要用户/通过身份验证。 在VS 2008中,如果我尝试“添加引用”或“添加服务引用”,我可以输入的只是URL,无法输入我的凭据。显然,如果我尝试加载ws,它会向我显示一条很好的消息:
请求失败,HTTP状态为403:Forbidden。 元数据包含无法解析的引用: HTTP请求未经授权,客户端身份验证方案为“匿名”。从服务器收到的身份验证标头是'Basic realm =“weblogic”'。 远程服务器返回错误:(401)未经授权。
所以我的问题是:是否有可能(使用VS 2008)添加对受保护的Web服务的引用?怎么样?
答案 0 :(得分:7)
听起来您正在尝试使用Web引用,而不是服务引用(尽管我认为Web引用是一种服务引用)。在VS08中,在启动“添加服务引用”后,键入Web服务的URL,单击“高级”按钮,然后单击“添加Web引用”。再次键入URL,然后单击“添加Web引用”。现在您应该使用Web引用,然后身份验证类似于以下内容:
WebService.Service myService = new WebService.Service();
myService.Credentials = new System.Net.NetworkCredential("username", "password");
WebService.ResultType results = myService.MyMethodReturnsResultType();
答案 1 :(得分:4)
根据服务的身份验证方式,您可能会解决问题。
如果它使用ASP.Net成员资格,那么找不到快乐。如果服务代码是您的,请暂时禁用身份验证以生成代理。
否则,请尝试使用标准机制:
http://username:password@host.domain/service
最佳选择:从供应商处获取WSDL并使用wsdl.exe生成代理。
回复评论时更新:
是的,模拟服务以生成代理是一个非常合理的计划,如果目标服务是ASP.net服务或只接受并返回简单类型。
Web服务构造函数具有接受Uri的重载,或者您只需修改生成的源。
如果您选择修改生成的源,您可能只想提取代理类并删除Web服务引用:
使用VS生成代理后,如果“显示所有文件”并深入查看WebService Reference,您将找到名为Reference.cs
的文件。这是您需要的唯一文件。将内容复制到另一个文件,然后只删除Web服务引用。
如果这样做,您可以在此时将您的身份验证逻辑添加到代理中。
但同样,从供应商处获取WSDL是最好的选择。
祝你好运。答案 2 :(得分:4)
延迟回复,但如果您在Visual Studio Web浏览器中打开网站并登录,也可以使其正常工作。仅在您的身份验证模型支持cookie时才有效。
答案 3 :(得分:0)
如果使用WSDL生成代码,则可以覆盖GetWebRequest()方法,该方法允许您添加Authorization标头
protected override System.Net.WebRequest GetWebRequest(Uri uri)
{
var req = base.GetWebRequest(uri);
req.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes("username:password")));
return req;
}