web-dev-qa-db-ja.com

AuthorizationヘッダーをWeb参照に追加する

クライアントの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);
}

サービスリクエストに認証ヘッダーを追加する適切な方法は何ですか?

ありがとうございました!

15
Mike

上記の応答は正しい軌道に乗っていましたが、別の場所にある必要がありました。

これを、.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を使用すると、プロキシクラスのメソッドが呼び出されたときに、リクエストに特定のヘッダーを設定できます。

ご協力いただきありがとうございます!

16
Mike

いくつかの変更が必要です。

まず、便利な定数HttpRequestHeader.Authorizationがあります。

次に、ヘッダーがBase64エンコードされていることを期待していますか?これは通常、基本認証に必要です。

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

この問題を抱えている人のために書いています。前述の回答で述べたように、継承階層はWebClientProtocolクラスまで上がるため、このクラスにはICredentialsプロパティがあります。このプロパティは、以下のようにNetworkCredentialインスタンスによって設定するだけです。

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

Reference.csを変更したりヘッダーを追加したりせずに、最も簡単な方法だと思います。

1
Ali Faradjpour