【解決方法】エラー: リッスンしているエンドポイントがありませんでした…

[ad_1]

WCF と HTTPS、エラー: リッスンするエンドポイントがありませんでした。これは、多くの場合、不正なアドレスまたは SOAP アクションによって発生します。

HTTPS 経由で動作するように WCF サービスを構成しようとしていますが、多くの問題が発生しています。

自己署名証明書を使用して開発サーバーにhttpsを実装していましたが、すべてが正常に機能しました。 本番環境に移行すると、URL のすべての値が Web サイトのアドレスではなくサーバー名で読み取られていました。

Web サーバーの HTTPS にホスト ヘッダーを追加しました。これにより、静的な wsdl と xsd の使用を回避できるはずですが、実際にはそうではありません。 静的な値を使用しない場合、すべての URL はサーバー名にデフォルト設定されます。

そこで、アドレス内に https が含まれる静的な wsdl ファイルと xsd ファイルを持つようにサービスを構成しました。 次に、これらのファイルを Web サイトのディレクトリにコピーして、ホストされるようにしました。 これらのファイルは私の Web サイト内でホストされており、使用されているアドレスはすべて正しく解決されます。

soad アドレスの wsdl には https という値があります。 https 値によりエラーが発生します。 https を http に置き換えるとサービスは機能しますが、

Wire Sharkで確認するとデータは暗号化されていません。 良くない。
どうすればこれを機能させることができますか?

テストのために送信できるテスト プロジェクトがあります。
私が受け取ったエラーは次のとおりです。

There was no endpoint listening at https://MYSERVICE/GpTest/Service1.svc that could accept the message.
This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details.
The remote server returned an error: (404) Not Found
Server stack trace:
   at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason)
   at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
   at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Exception rethrown at [0]:
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   at TestWcfHttps1Caller.ServiceReference1.IService1.DoAddition(Int32 value1, Int32 value2)
   at TestWcfHttps1Caller.ServiceReference1.Service1Client.DoAddition(Int32 value1, Int32 value2) in C:\www\releases\Test\WCF\TestWcfHttps1Caller\Service References\ServiceReference1\Reference.cs:line 123
   at TestWcfHttps1Caller._Default.Page_Load(Object sender, EventArgs e) in C:\www\releases\Test\WCF\TestWcfHttps1Caller\Default.aspx.cs:line 15
   at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
   at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
   at System.Web.UI.Control.OnLoad(EventArgs e)
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

解決策 1

3 つの異なる解決策を組み合わせる必要がありましたが、うまくいきました。

1. HTTPS ホストヘッダーを有効にする
2. 静的 wsdl および xsd ファイルを有効にする
3. web.config を構成する

したがって、WCF で HTTPS を有効にするには、次のことを行う必要がありました。

1. 静的 wsdl および xsd ファイルをクレートする

わかりました、どうやって?
1.1 ?wsdl リンクに従って、.wsdl ファイル タイプとして保存します。 ファイルを変更し、soad アドレスを https に変更します。 ライブサーバーには、実際に使用したい URL ではなく、サーバー名へのリンクがある可能性が高いため、開発サーバーからこのファイルにリンクします。
1.2 .wsdl ファイルで、wsdl 内の xsd リンクごとに .xsd ファイルを作成します (つまり、xsd0.xsd、xsd1.xsd、xsd2.xsd)。
1.3 作成した新しい xsd ファイルを使用するように、wsdl ファイルおよび xsd ファイル内の xsd ドキュメントへのすべての参照を更新します。 使用したい URL を使用してホストされた値をポイントします。すべてのアドレスは https を使用する必要があります。
1.3 これらすべてのファイルを Web アプリのルートでホストし、各 URL が正しく解決されることをテストします。
1.4 注: サービスに変更を加えるたびに、この方法ですべての静的ファイルを再構築する必要があります。

2. ライブ IIS サーバーで HTTPS ホスト ヘッダーを有効にします (これには GUI はなく、コマンド ラインを使用する必要があります)

3. サービス Web 構成を変更して、次の属性にトランスポート セキュリティ モードと HTTPS を含めます (以下の web.config で「https」を見つけます)。

これが私のweb.configファイルです

XML
<system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="TransportSecurity">
          <security mode="Transport">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <services>
      <service  behaviorConfiguration="TestWcfHttps1.Service1" name="TestWcfHttps1.Service1">
        <endpoint address="https://MYSERVER/GpTest/Service1.svc" 
                  binding="basicHttpBinding" 
                  bindingConfiguration="TransportSecurity"
                  contract="TestWcfHttps1.IService1">
          <identity>
            <dns value="" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="TestWcfHttps1.Service1">
          <serviceMetadata httpsGetEnabled="true" externalMetadataLocation="https://MYSERVER//GpTest/Service1.wsdl" />
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>

[ad_2]

コメント

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