给Web引用添加授权头

18

我正尝试向客户的Web服务发送请求(我不知道客户端使用的底层平台)。我已经在Visual Studio 2010中使用“添加Web引用”消耗了客户端的WSDL,并生成了我的代理类(名为“ContactService”)。

现在,我需要像下面这样添加一个授权头到我的服务请求中。

Header=Authorization & Value=Basic 12345678901234567890

(上面的“123456...”值只是占位符)

ContactService service = new ContactService();

//not sure if this is the right way - it's not working
WebClient client = new WebClient();
client.Headers.Add("Authorization", "Basic 12345678901234567890");            
service.Credentials = client.Credentials;

int contactKey = null;
try
{                
   contactKey = service.CreateContact("ABC", emailAddress, firstName, lastName, null);
}

如何在服务请求中正确添加授权头?

谢谢!

4个回答

19

上述回答基本正确,只是需要将其放到不同的位置。

我将其添加到了由.Net生成的Web参考代理类中:

protected override WebRequest GetWebRequest(Uri uri)
    {
        HttpWebRequest req = (HttpWebRequest)base.GetWebRequest(uri);            
        req.Headers.Add(HttpRequestHeader.Authorization,
                "Basic " + "12345678901234567890");

        return req;
    }

一个 Web 引用代理类继承自 System.Web.Services.Protocols.SoapHttpClientProtocol 类。该类包含对 System.Net.WebRequest.GetWebRequest(Uri uri) 方法的调用。当代理类的方法被调用时,我们可以通过 WebRequest 在请求中设置特定的标头。

谢谢您的帮助!


谢谢,这对我帮助很大!提醒一下那些使用VS 2008的人,在VS 2008中创建代理类(不会在asp.net应用程序中创建代理类),我必须将Web引用添加到一个虚拟控制台应用程序中,然后将代理类复制到我的Web应用程序中。 - Kosta

15

有几个更改需要进行。

首先,有一个方便的常量HttpRequestHeader.Authorization

其次,他们是否期望标头为Base64编码 - 此通常对于基本身份验证是必需的。

WebClient.Headers.Add(HttpRequestHeader.Authorization, 
    "Basic " + Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes("12345678901234567890")));

谢谢!不幸的是,这还没解决问题。我仍然看到一个“401未授权”的异常。我需要以其他方式在服务端设置来转换从“客户端”到“服务端”的内容吗? - Mike
你能否使用 Fiddler 或类似工具查看原始请求,以检查头部是否存在且正确吗?此外,第三方是否能够帮助诊断出问题所在(或者他们是否有任何需要的文档)? - Fenton
使用 Fiddler,似乎请求中没有设置 Header。我将 Header 添加到 WebClient 而不是服务代理 - 是否有一种方法可以添加到服务代理呢? - Mike

3

我写这篇文章是为了帮助那些遇到这个问题的人。正如之前的回答所提到的,继承层次结构一直延伸到WebClientProtocol类,该类有一个ICredentials属性,只需按照以下方式使用NetworkCredential实例设置此属性:

YourServis.Credentials = new NetworkCredential("UserName", "Password", "Domain");

我认为最简单的方法是不更改Reference.cs或添加头文件。

0

虽然这是一个相当古老的帖子,但如果您正在使用vs2022消费旧服务,则最好的方法是创建一个新类并从代理类继承解决方案代码,因为您无法直接编辑代理类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接