「サービス参照の追加」で生成したWebサービスプロキシのBasic認証方法

C#入門
スポンサーリンク

今回の記事では、Visual Studioの「サービス参照の追加」で、外部サービスのWebAPI(SOAP API)のWSDLを指定して生成されたWebサービスクライアントクラス(Webサービスプロキシ)を使用してコーディングをした際に、「Basic認証」の実装方法がわからず苦労したため、やり方を記事に残しておきます。

尚、当記事で使用している環境は以下です。

IDE:Visual Studio 2019
言語:C#(.Net Framework 4.7.2

 
 

「サービス参照の追加」でWebサービスプロキシを自動生成

SOAPで実装されたWebAPIを利用する場合、そのサービスのWSDLを読み込むことで、提供されているAPIの定義情報が取得できます。

Visual Studioでは、「サービス参照の追加」機能でWSDLが配置されているURLを指定し読み込ませることで、そのAPIを利用するためのWebサービスクライアントクラス(Webサービスプロキシ)が自動的に生成されます。
そのクラスを利用することで、Webサービスとの連携処理を効率よく開発することができます。

当記事の本題とは離れますが、「サービス参照の追加」でWebサービスクラスを生成する方法とその使い方を簡単に紹介しておきます。

 

Visual Studioで「サービス参照の追加」からWDSLを参照

Visual Studioの「ソリューションエクスプローラー」内の「参照」を右クリックして、「サービス参照の追加」を選択します。

ソリューションエクスプローラーから「サービス参照の追加」を選択

「サービス参照の追加」画面が表示されるため、SOAP APIであれば、WSDL用のURLを「アドレス」に入力して「移動」を押下します。
すると、「サービス」や「操作」にWSDLで定義された情報が読み込まれます。

あとは必要によって「名前空間」を変更して「OK」を押下します。

「サービス参照の追加」画面でWSDLの読み込み

これでWebサービスクラスが自動的に生成され、App.configも併せて書き換えられます。

 

Webサービスプロキシの簡単な使い方

C#のサンプルコードはネットでも広く公開されているため、この記事内で紹介するまでもないかも知れませんが、参考程度に掲載しておきます。

認証が無く、呼び出すWebメソッドのパラメーターも不要であれば以下のようなコードになります。

  using System;
  using ConsoleApp.ServiceReference1;

  namespace ConsoleApp
  {
      class Program
      {
          static void Main(string[] args)
          {
              // Webサービスプロキシのインスタンスを作成
              SampleApiClient Client = new SampleApiClient();

              try
              {
                  // APIの呼び出し例
                  var result = Client.SampleMethod();

                  // APIからの応答を処理
                  Console.WriteLine("API Response: " + result);
              }
              catch (Exception ex)
              {
                  Console.WriteLine("Error: " + ex.Message);
              }
              finally
              {
                  // 必要に応じてクライアントをクローズ
                  Client.Close();
              }

          }
      }
  }

 

ネットでよくあるBasic認証を追加したコード

次に、ネットでよくあるBasic認証に対応した場合のコードを書いてみます。

  using System;
  using ConsoleApp.ServiceReference1;

  namespace ConsoleApp
  {
      class Program
      {
          static void Main(string[] args)
          {
              // Webサービスプロキシのインスタンスを作成
              SampleApiClient Client = new SampleApiClient();
            
              // Basic認証のユーザー名とパスワード
              string username = "ユーザー名";
              string password = "パスワード";
              
              // サービス資格情報にユーザー名とパスワードをセット
              Client.ClientCredentials.UserName.UserName = username;
              Client.ClientCredentials.UserName.Password = password;

              try
              {
                  // APIの呼び出し例
                  var result = Client.SampleMethod();

                  // APIからの応答を処理
                  Console.WriteLine("API Response: " + result);
              }
              catch (Exception ex)
              {
                  Console.WriteLine("Error: " + ex.Message);
              }
              finally
              {
                  // 必要に応じてクライアントをクローズ
                  Client.Close();
              }

          }
      }
  }

本来は上記のコードで正しいのですが、実際に実行すると、認証情報が渡せていないとエラーになります。
また、ネットで調べても、なかなか原因がわからずハマりました。

 
 

Basic認証が動作しないのはApp.config側の設定不足

上手くBasic認証が動作しなかったのは、App.configに対して必要な設定が足りていなかったからでした。

まず、「サービス参照の追加」を行っていない状態のApp.configは以下の状態です。

  <?xml version="1.0" encoding="utf-8" ?>
  <configuration>
      <startup> 
          <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
      </startup>
  </configuration>

次に、「サービス参照の追加」で自動的に編集されたApp.configの例が以下です。

  <?xml version="1.0" encoding="utf-8" ?>
  <configuration>
      <startup> 
          <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
      </startup>
      <system.serviceModel>
          <bindings>
              <basicHttpBinding>
                  <binding name="SamplePortBinding">
                      <security mode="Transport" />
                  </binding>
                  <binding name="SamplePortBinding1" />
              </basicHttpBinding>
          </bindings>
          <client>
              <endpoint address="https://example.com/SOAP/WebServicesEndPoint"
                  binding="basicHttpBinding" bindingConfiguration="SamplePortBinding"
                  contract="ServiceReference1.SampleApi" name="SamplePort" />
          </client>
      </system.serviceModel>
  </configuration>

<system.serviceModel>という要素が追加されているのがわかります。
これらの構成している要素の詳細についてはMicrosoft Learnの「WCF構成スキーマ」の以下のリンクを参照ください。

- .NET Framework
WCF サービスとクライアント アプリケーションを構成できる、WCF ServiceModel 構成要素について説明します。
Basic認証を有効にするには、要素:securityのなかに、<transport clientCredentialType="Basic" />を追加して上げる必要があります。

追加した場合のApp.configの例は以下になります。

  <?xml version="1.0" encoding="utf-8" ?>
  <configuration>
      <startup> 
          <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
      </startup>
      <system.serviceModel>
          <bindings>
              <basicHttpBinding>
                  <binding name="SamplePortBinding">
                    <security mode="Transport">
                      <transport clientCredentialType="Basic" />
                    </security>
                  </binding>
                  <binding name="SamplePortBinding1" />
              </basicHttpBinding>
          </bindings>
          <client>
              <endpoint address="https://example.com/SOAP/WebServicesEndPoint"
                  binding="basicHttpBinding" bindingConfiguration="SamplePortBinding"
                  contract="ServiceReference1.SampleApi" name="SamplePort" />
          </client>
      </system.serviceModel>
  </configuration>

これでBasic認証が有効になります。

中の人
中の人

おつかれさまでした!

 
 

最後に

今回の記事では、Visual Studio の「サービス参照の追加」で生成したWebサービスクライアントクラス(Webサービスプロキシ)でBasic認証を有効にする方法を紹介しました。

コード自体はネット上でも幾つか公開されていましたが、App.configに言及した記事があまりなく、動作させるのに苦労したため記事にしてみました。

どなたかの参考になれば幸いです。

今回も読んでいただきましてありがとうございました。
それでは皆さまごきげんよう!

タイトルとURLをコピーしました