Kesalahan: Tidak ada titik akhir yang mendengarkan di…

pemrograman


WCF dan HTTPS, Kesalahan: Tidak ada titik akhir yang mendengarkan, Hal ini sering kali disebabkan oleh alamat atau tindakan SOAP yang salah

Saya mencoba mengonfigurasi Layanan WCF agar berfungsi melalui HTTPS dan saya mengalami banyak masalah.

Saya menerapkan https di server dev saya dengan sertifikat yang ditandatangani sendiri, semuanya berfungsi dengan baik. Ketika saya pindah ke produksi, semua nilai url dibaca dengan nama server, bukan alamat situs web saya.

Saya menambahkan header host ke HTTPS di server web saya yang seharusnya memungkinkan saya menghindari penggunaan wsdl dan xsd statis tetapi tidak. Tanpa nilai statis, semua url akan diubah menjadi nama server.

Jadi, saya mengonfigurasi layanan agar memiliki file wsdl dan xsd statis yang semuanya berisi https di dalam alamatnya. Saya kemudian menyalin file-file itu ke direktori situs web saya sehingga di-host. File-file itu dihosting di situs web saya dan alamat yang digunakan semuanya diselesaikan dengan benar.

Di wsdl saya untuk alamat soad saya, saya memiliki nilai dengan https. Nilai https menyebabkan kesalahan. Ketika saya mengganti https dengan http layanannya berfungsi tetapi kapan

Saya memeriksanya dengan wire shark, datanya tidak dienkripsi. Tidak baik.
Bagaimana saya bisa membuat ini berfungsi?

Saya memiliki proyek uji yang dapat saya kirimkan untuk pengujian.
Inilah kesalahan yang saya terima:

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)

Solusi 1

Saya berhasil, dibutuhkan kombinasi tiga solusi berbeda

1. Aktifkan header host HTTPS
2. Aktifkan file wsdl dan xsd statis
3. Konfigurasikan web.config

Jadi, untuk mengaktifkan HTTPS untuk WCF saya harus melakukannya

1. Buat file wsdl dan xsd statis

Oke, bagaimana caranya?
1.1 ikuti tautan ?wsdl dan simpan sebagai jenis file .wsdl. Ubah file dan ubah alamat soad menjadi https. Anda akan menautkan ke file ini dari server dev Anda karena server langsung Anda kemungkinan besar memiliki tautan ke nama server dan bukan url yang sebenarnya ingin Anda gunakan
1.2 dalam file .wsdl buat file .xsd untuk setiap tautan xsd dalam wsdl (yaitu: xsd0.xsd, xsd1.xsd, xsd2.xsd)
1.3 perbarui semua referensi ke dokumen xsd di file wsdl dan file xsd untuk menggunakan file xsd baru yang Anda buat. Arahkan ke nilai yang dihosting menggunakan url yang ingin Anda gunakan, semua alamat sekarang harus menggunakan https
1.3 host semua file tersebut di root aplikasi web Anda dan uji apakah setiap url diselesaikan dengan benar
1.4 Catatan: setiap kali Anda membuat perubahan pada layanan, Anda perlu membangun kembali semua file statis dengan cara ini

2. Aktifkan header host HTTPS di server IIS langsung (tidak ada gui untuk ini, harus menggunakan baris perintah)

3. Ubah konfigurasi web Layanan untuk menyertakan mode Keamanan Transportasi dan HTTPS dalam atribut berikut (temukan “https” di web.config di bawah)

Ini file web.config saya

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>

コメント

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