16

我正在尝试向客户端的 Web 服务发出请求(我不知道客户端的底层平台)。我使用“添加 Web 引用”在 Visual Studio 2010 中使用了客户端的 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

3 回答 3

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 允许我们在调用代理类的方法时在请求上设置特定的标头。

谢谢你的帮助!

于 2013-01-24T13:07:22.243 回答
14

有几个改变要做。

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

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

WebClient.Headers.Add(HttpRequestHeader.Authorization, 
    "Basic " + Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes("12345678901234567890")));
于 2013-01-23T20:48:02.290 回答
2

我正在为现在有这个问题的人写这篇文章。正如前面的答案中提到的继承层次结构上升到WebClientProtocol类,这个类有一个ICredentials属性,只需通过一个NetworkCredential实例设置这个属性,如下所示:

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

我认为 taht 是最简单的方法,无需更改 Reference.cs 或添加标题。

于 2018-04-11T12:28:45.527 回答