クライアントの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);
}
サービスリクエストに認証ヘッダーを追加する適切な方法は何ですか?
ありがとうございました!
上記の応答は正しい軌道に乗っていましたが、別の場所にある必要がありました。
これを、.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を使用すると、プロキシクラスのメソッドが呼び出されたときに、リクエストに特定のヘッダーを設定できます。
ご協力いただきありがとうございます!
いくつかの変更が必要です。
まず、便利な定数HttpRequestHeader.Authorization
があります。
次に、ヘッダーがBase64エンコードされていることを期待していますか?これは通常、基本認証に必要です。
WebClient.Headers.Add(HttpRequestHeader.Authorization,
"Basic " + Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes("12345678901234567890")));
この問題を抱えている人のために書いています。前述の回答で述べたように、継承階層はWebClientProtocol
クラスまで上がるため、このクラスにはICredentials
プロパティがあります。このプロパティは、以下のようにNetworkCredential
インスタンスによって設定するだけです。
YourServis.Credentials = new NetworkCredential("UserName", "Password", "Domain");
Reference.csを変更したりヘッダーを追加したりせずに、最も簡単な方法だと思います。