53

Web サービスが Java Axis 1.4 である Web サービス クライアントを c# で記述しようとしています。Axis サービスでは、HTTP ヘッダーにAuthorization: Basic Base64EncodedTokenヘッダー値が必要です。通常の WSDL 生成参照や WSE3.0 のように、visual studio.net で Web サービスを使用する標準的な方法でこのヘッダーを設定する方法が見つかりません。

プロジェクトは.net 2.0を使用して開発されているため、WCFを使用できません。

これを行う方法はありますか?

4

7 に答える 7

52

元の作成者が解決策を見つけたようですが、実際のカスタム ヘッダーを追加しようとしてここに来た他の人にとっては、生成されたプロトコル コードを変更するアクセス権があれば、オーバーライドできますGetWebRequest

protected override System.Net.WebRequest GetWebRequest(Uri uri)
{
  System.Net.WebRequest request = base.GetWebRequest(uri);
  request.Headers.Add("myheader", "myheader_value");
  return request;
}

ステップインする場合は、必ず属性を削除してくださいDebuggerStepThroughAttribute

于 2010-05-06T10:08:45.220 に答える
27

ここでWCFについて話しているのですか?サービス呼び出しで http 認証ヘッダーが追加されないという問題がありました。呼び出しをこのステートメントにラップすると問題が解決しました。

  using (OperationContextScope scope = new OperationContextScope(RefundClient.InnerChannel))
  {
            var httpRequestProperty = new HttpRequestMessageProperty();
            httpRequestProperty.Headers[System.Net.HttpRequestHeader.Authorization] = "Basic " +
            Convert.ToBase64String(Encoding.ASCII.GetBytes(RefundClient.ClientCredentials.UserName.UserName + ":" +
            RefundClient.ClientCredentials.UserName.Password));
            OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty;

            PaymentResponse = RefundClient.Payment(PaymentRequest);
   }

これは、http または https を介した基本認証を使用して、.NET 経由で IBM ESB への SOAP 呼び出しを実行していました。

オンラインで解決策を見つけるのに大きな問題があったので、これが誰かの助けになることを願っています.

于 2009-11-11T03:21:55.273 に答える
7

カスタム HTTP ヘッダー (SOAP ヘッダーではない) を送信する場合は、HttpWebRequest クラスを使用する必要があります。コードは次のようになります。

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
webRequest.Headers.Add("Authorization", token);

Visual Studio で生成されたプロキシを使用して HTTP ヘッダーを追加することはできません。これは非常に面倒です。

于 2009-05-22T13:43:19.047 に答える
5

このコードを見つけて、問題を解決しました。

http://arcware.net/setting-http-header-authorization-for-web-services/

protected override WebRequest GetWebRequest(Uri uri)
{
    // Assuming authValue is set from somewhere, such as the config file
    HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(uri);
    request.Headers.Add("Authorization", string.Format("Basic {0}", authValue));
    return request;
}
于 2010-08-10T21:48:52.507 に答える
0

これが私のために働いたものです:

protected override System.Net.WebRequest GetWebRequest(Uri uri)
{
        HttpWebRequest request;
        request = (HttpWebRequest)base.GetWebRequest(uri);
        NetworkCredential networkCredentials =
        Credentials.GetCredential(uri, "Basic");
        if (networkCredentials != null)
        {
            byte[] credentialBuffer = new UTF8Encoding().GetBytes(
            networkCredentials.UserName + ":" +
            networkCredentials.Password);
            request.Headers["Authorization"] =
            "Basic " + Convert.ToBase64String(credentialBuffer);
            request.Headers["Cookie"] = "BCSI-CS-2rtyueru7546356=1";
            request.Headers["Cookie2"] = "$Version=1";
        }
        else
        {
            throw new ApplicationException("No network credentials");
        }
        return request;
}

このプロパティを設定することを忘れないでください:

service.Credentials = new NetworkCredential("username", "password");  

Java サービスがリクエストを受け入れず、Unauthorized エラーが発生していたため、ヘッダーに Cookie と Cookie2 が設定されています。

于 2013-08-01T23:14:04.297 に答える