2011-08-17 8 views
7

C#でWebサービスリクエストを呼び出す際に問題があります。C#でWebサービスリクエストを事前認証する

Soap UIで[Preemptively Authenticate]オプション(ファイル、環境設定、HTTP設定)を有効にして、サービスとリクエストが正しく動作しています。この設定を有効にしないと、サービスは 'Java.Lang.NullPointerException'を返します。

私が抱えている問題は、C#コンテキストでこの設定を有効にする方法がわからないことです。

私は特定のサービスへのいわゆるサービスリファレンスを保持する.NET 3.5クラスライブラリを持っています。これは単純なコードスニペットです。

try 
{ 
    CatalogService.CatalogChangeClient service = new CatalogService.CatalogChangeClient(); 
    service.ClientCredentials.UserName.UserName = "fancydress"; 
    service.ClientCredentials.UserName.Password = "47fda9cb4b51a9e"; 
    service.ClientCredentials.SupportInteractive = true; 

    ProductUpdate[] products = new ProductUpdate[1]; 
    products[0] = new ProductUpdate(); 
    products[0].ProductCode = "00001"; 
    products[0].ProductDescription = "TestProduct"; 

    string result = service.UpdateProducts(products); 
} 
catch (Exception exception) 
{ 
    Console.WriteLine(exception.Message); 
} 

最初の返信後に更新します。

CatalogService.CatalogChangeClientクラスは

System.ServiceModel.ClientBase<TChannel> 

エンド更新

WCF抽象クラスを実装しているようだ誰も私は、このプロパティを設定するのに役立ちてもらえますか?

+0

はESPより多くのコードを表示してください。 公共部分クラスのCatalogChangeClient:System.ServiceModel.ClientBase 、Fancydressインタフェースは 'CatalogService.CatalogChangeClient'はそれはWCFからSystem.ServiceModel.ClientBaseクラスを実装しているようだ – Yahia

+0

実装しています。 ResourceAccess.MCSF.CatalogService.CatalogChange –

+1

私はこれを収集します.NET実装の問題です。リクエストを送信し、サービスから401が取得されたときにのみ、資格証明付きで再送信されます...あなたのJava WebServiceは送信されないようです401 - あなたは本当に事実であることを最初に確認する必要がありますが(WireShark)...それは事実です:これを回避するためには、あなたが別のクライアント(プロキシ)を使用しなければならないと思われます。資格はいつも... – Yahia

答えて

5

生成されたクライアントスタブからGetWebRequestメソッドをオーバーライドすることができます。

私はこれを一度使っており、それが私の問題を解決しました。 次を参照してください。http://www.eggheadcafe.com/community/wcf/18/10056093/consuming-webservices-and-http-basic-authentication.aspx 少し下にスクロールしてください。

はここのリンクからコードです:

protected override System.Net.WebRequest GetWebRequest(Uri uri) 
{ 
    HttpWebRequest request; 
    request = (HttpWebRequest)base.GetWebRequest(uri); 

    if (PreAuthenticate) 
    { 
     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); 
     } 
     else 
     { 
      throw new ApplicationException("No network credentials"); 
     } 
    } 
    return request; 
} 
+1

[.NET WebRequest.PreAuthenticate]には良い記事があります - それはまったく同じではありません。(http://www.west-wind.com/weblog/posts/2010/Feb/18/NET-WebRequestPreAuthenticate-not-quiteあなたの答えやその他のオプションをもっと詳しく説明しています。 – ChrisW

+1

あなたは余分なスペースが必要だと思います:request.Headers ["Authorization"] = "Basic" + ...そうでなければ+1 –

+0

@Julia Hayward - –

関連する問題