如何在visual studio 2008中添加服务引用,以便对受密码保护的Web服务进行身份验证

时间:2010-04-08 21:33:44

标签: visual-studio-2008 authentication web-services

我想引用一个Web服务,它需要用户/通过身份验证。 在VS 2008中,如果我尝试“添加引用”或“添加服务引用”,我可以输入的只是URL,无法输入我的凭据。显然,如果我尝试加载ws,它会向我显示一条很好的消息:

  

请求失败,HTTP状态为403:Forbidden。   元数据包含无法解析的引用:   HTTP请求未经授权,客户端身份验证方案为“匿名”。从服务器收到的身份验证标头是'Basic realm =“weblogic”'。   远程服务器返回错误:(401)未经授权。

所以我的问题是:是否有可能(使用VS 2008)添加对受保护的Web服务的引用?怎么样?

4 个答案:

答案 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;
}