C#でWebサービス(SOAP)を開発してIISへ公開する

# 1. はじめに
* Java/Axsis2で実装していたレガシーシステムから、C#にSOAP通信サービスを移行したい
* IISへSOAP通信サービスを公開して、Soap UIを使用してクライアント側の稼働確認をしたい
* 開発効率を考えて.NET Frameworkに含まれているASP.NETのasmxを使用する
 * .NETX系ではSOAP通信のツールは含まれていないため

# 2. 開発環境
* Visual Studio 2022
* .NET Framework 4.8
* IIS 8
* Soap UI 5.7

# 3. ASP.NETプロジェクトの作成
## 3.1. Visual Studioで新規プロジェクトを作成する
* 「ASP.NET Webアプリケーション (.NET Framework)」 を選択する
* ASP.NETサービスがインストールされていない場合は別途Visual Struio インストーラーからインストールする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/f2d6289e-1e26-2412-a894-15717d373296.png)

* フレームワークは 「.NET Framework 4.8」 を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/2f5a80ee-8038-8cb8-ae68-fb8071e7482e.png)

## 3.2. ASMXファイルを追加する
* 新しい項目を追加で、「Webサービス(ASMX)」 を追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/fd7cb894-7c2c-70ef-ba17-fc06b407a000.png)

* サンプルで 「HelloWorld」 サービスが記述されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/b2d0be03-16cf-4652-e386-608200fe7c33.png)

## 3.3. サンプルのサービスを起動する
* 実行ボタンをクリックすると、Webブラウザが立ち上がる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/e5122381-caf4-dec5-1397-d3476b61eba1.png)

* 画面上部の「HelloWorld」のリンクをクリックすると、SOAPの呼び出し方が記載されれている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/e4975700-e326-7552-eca9-cdb4432fdb13.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/c4af18e9-4401-1e45-e262-18965c464f4d.png)

* 画面上部の「起動ボタン」をクリックすると、SOAPの呼び出し結果が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/5dbad912-801e-39c1-8302-7e8b2ce3a53c.png)

# 4. SOAP通信サービスのパラメータ修正
* SOPAでパラメータを送受信できるSearchサービスを追加する
```csharp:WebService1.asmx.cs (抜粋)
        [WebMethod]
        public ParameterDto Search(ParameterDto inParameter)
        {
            var outParameter = new ParameterDto
            {
                id = inParameter.id,
                outputDto = new OutputDto
                {
                    output1 = inParameter.outputDto.output1,
                    output2 = inParameter.outputDto.output2
                }
            };
            return outParameter;
        }

```
* パラメータのカスタムDTOクラスを追加する
```csharp:ParameterDto.cs
namespace WebApplication1
{
    public sealed class ParameterDto
    {
        public int id { get; set; }
        public OutputDto outputDto { get; set; }
    }
}
```
* パラメータ内のネストしたカスタムDTOクラスを追加する
```csharp:OutputDto.cs 
namespace WebApplication1
{
    public sealed class OutputDto
    {
        public string output1 { get; set; }
        public string output2 { get; set; }
    }
}
```

# 5. Soap UIでの動作確認
## 5.1. Soap UI をダウンロードする
* https://www.soapui.org/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/c9f84078-0090-6ce5-20b9-d9db28e01f95.png)

## 5.2. Soap UI をインストールする
* ダウンロードしたセットアップファイルを実行する

## 5.3. New SOAP Project を作成する
* 「 File 」> 「 New SOAP Project 」 をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/50f0c53b-e1cd-1c2d-7ac9-30a4a868cc92.png)

* 「 Project Name (任意) 」、「Initial WSDL 」を入力して、OKボタンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/04dc5e2d-6ca0-0966-eaef-020ecad060fc.png)
>  WSDLは 「https://localhost:44308/ [ASMXファイル名] ?WSDL」を指定する

* SOAP呼び出しのリクエストが作成される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/6343c145-fe4b-c586-5e8f-1fc45cab03aa.png)

## 5.4. SOAP Projectを実行する
* SOAP Project のRequest値を入力する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/f4994465-68fa-2173-bc2e-3c8677ed0219.png)

* 画面左上の実行アイコンをクリックすると、画面右側のResponseが返却される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/1eb09ee0-bd38-4da0-1f27-c9c256ac829a.png)

## 5.5. 実行時エラーが発生したら
* 下記エラーが出る場合は、ProxyをON/OFFすることで解決できる可能性があります。
**org.apache.xmlbeans.XmlException: org.apache.xmlbeans.XmlException: error: The entity "copy" was referenced, but not declared**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/ff421465-82fb-6b49-5984-49faf15aa702.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/294bb98d-32a7-68e4-2bc0-c02fdccdf301.png)

# 6. IISサーバへサービスを公開する
# 6.1. ASMXファイルを修正する
* Namespaceを確定しているURLに変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/09911187-3f21-5ea9-62c1-df5b175b9e80.png)

# 6.2. サービスを公開する(ローカル側)
* クラスビューからサービスを右クリックして、「 発行 」をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/f897ad6a-197e-0410-078a-22e92539a798.png)

* 今回はフォルダーを選択して、ローカルでファイルを作成した後に手動でサーバーへアップする方法をとる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/cff55bfe-b93d-bb95-2d76-807a5af081ea.png)

* 任意の出力先を指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/81020036-da51-baa1-8f3b-8b7333a87a82.png)

* 「 発行 」 ボタンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/5c378dd0-3681-214c-63db-ce5f7ea18749.png)

* ローカルに公開サービスが出力される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/dd2a341b-c8d7-902a-18f1-0b0821f25c83.png)

# 6.3. サービスを公開する(サーバ側)
* IISに必要なプラットフォームをインストールする （任意）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/8380f751-a15a-5ef5-6200-bd93a55ef7e7.png)

* IISサーバへローカルのパッケージファイルをコピーすることで公開できた

# 7. ソースコード
https://github.com/YoshijiGates/CSharp/tree/main/SsoapService

# 8. 参考文献
https://www.ipentec.com/document/csharp-asp-net-create-asmx-web-service

https://skill-note.net/post-202/