WCFのServiceHostが終了出来なくなる

Category: fx wcf_ja

Question

こーじー on Wed, 08 Aug 2018 06:51:27


いつも参考にさせていただいております。

現在VB.net .Net Framework 4.5.2でWindowsアプリケーションを開発しております。

クライアントからWebサービスへのアクセスは、

Messageセキュリティの匿名認証でアクセスしています。

また、サーバー側で動作しているWebサービスは、プログラム上で

ServiceHostのインスタンスを生成して起動させています。

上記のような構成で、クライアントからアクセスしているのですが、

サーバー側のファイルを入替えようとしたときに、サーバー側で起動している

Webサービス(exeファイル)が停止出来ない問題が発生しております。

何か原因の調査方法や、解決策お持ちの方いらっしゃましたら、

ご教授いただけると幸いです。

コンフィグ設定(クライアント)

---------------------------------------------------------------------------------------

  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="wsHttpBindingMessage" 
                 closeTimeout="00:01:00" 
                 openTimeout="00:01:00" 
                 receiveTimeout="00:01:00" 
                 sendTimeout="00:10:00"
                 maxReceivedMessageSize="64000000">
          <reliableSession inactivityTimeout="01:00:00" enabled="true" />
          <security mode="Message">
            <message clientCredentialType="None" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://<ホスト名>:<ポート番号>/WcfService/"
                binding="wsHttpBinding"
                bindingConfiguration="wsHttpBindingMessage"
                behaviorConfiguration="CredentialBehavior"
                contract="<Interface名>"
                name="WcfClient_Message_H">
        <identity>
          <dns value="<DNS名>"/>
        </identity>
      </endpoint>
    </client>
    <behaviors>
      <endpointBehaviors>
        <behavior name="CredentialBehavior">
          <clientCredentials>
            <serviceCertificate>
              <authentication certificateValidationMode="None"/>
            </serviceCertificate>
          </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>

---------------------------------------------------------------------------------------

コンフィグ設定(サーバー)

---------------------------------------------------------------------------------------

  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="wsHttpBindingConf" receiveTimeout="00:30:00" maxReceivedMessageSize="64000000">
          <reliableSession inactivityTimeout="01:00:00" enabled="true" />
          <security mode="Message">
            <message clientCredentialType="None" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="BehaviorConf" name="WCF">
        <endpoint address="http://<ホスト名>:<ポート番号>/WcfService/" binding="wsHttpBinding"
          bindingConfiguration="wsHttpBindingConf" contract="<Interface名>" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="BehaviorConf">
          <serviceThrottling maxConcurrentCalls="512" maxConcurrentSessions="20" maxConcurrentInstances="20"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <serviceCredentials>
            <serviceCertificate findValue="WCF_X509"
                   storeLocation="CurrentUser"
                   storeName="My"
                   x509FindType="FindBySubjectName" />
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

---------------------------------------------------------------------------------------

ServiceHost起動プログラム

---------------------------------------------------------------------------------------

    Sub Main()
        Using svcHost As ServiceModel.ServiceHost = New ServiceModel.ServiceHost(GetType(WCF))
            Try
                ' Open the ServiceHost to start listening for messages.
                svcHost.Open()

                ' The service can now be accessed.
                Console.WriteLine("The service is ready.")
                Console.WriteLine("Press <ENTER> to terminate service.")
                Console.WriteLine()
                Console.ReadLine()

                'Close the ServiceHost.
                svcHost.Close()

            Catch timeout As TimeoutException
                Console.WriteLine(timeout.Message)
                Console.ReadLine()
            Catch commException As System.ServiceModel.CommunicationException
                Console.WriteLine(commException.Message)
                Console.ReadLine()
            End Try
        End Using
    End Sub
    ---------------------------------------------------------------------------------------

以上です。よろしくお願い致します。