#c# #windows #wcf #service
#c# #Windows #wcf #Обслуживание
Вопрос:
У меня есть служба Windows, в которой размещается моя служба wcf.
App.config является:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2"/>
</startup>
<system.serviceModel>
<services>
<service behaviorConfiguration="RestWCFServiceLibrary.Service1Behavior" name="RestWCFServiceLibrary.RestWCFServiceLibrary">
<endpoint address="" binding="webHttpBinding" contract="RestWCFServiceLibrary.IRestWCFServiceLibrary" behaviorConfiguration="web">
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8888/RestWCFServiceLibrary/"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="RestWCFServiceLibrary.Service1Behavior">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="web">
<webHttp/>
<CorsSupport/>
</behavior>
</endpointBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<add name="CorsSupport" type="WebHttpCors.CorsSupportBehaviorElement, WebHttpCors, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</behaviorExtensions>
</extensions>
</system.serviceModel>
</configuration>
Моя проблема в том, что если мой веб-сайт использует https: //, ему не удается выполнить http-вызов из-за CORS. Веб-сайт https отправляет запрос ajax GET на localhost.
Теперь я пытаюсь изменить свою службу Windows на https, но везде я вижу некоторые привязки ssl командной строки. Есть ли другой способ, которым я могу изменить свою службу Windows, размещенную в wcf, на использование https?
Что мне нужно сделать, чтобы перенести эту http-службу на https.
Пожалуйста, приведите пример того, что необходимо изменить в моем app.config.
Ответ №1:
Я наткнулся на похожую проблему, поэтому я использовал инструмент настройки WCF для написания App.Config для меня, и внутри конечных точек я выбрал mexhttpsbinding, и да, привязка https сработала..
Ответ №2:
Давайте просто добавим конечную точку https. Следующая конфигурация работает должным образом как по http, так и по https.
<system.serviceModel>
<services>
<service behaviorConfiguration="mybehavior" name="WcfService1.Service1">
<endpoint address="" binding="webHttpBinding" contract="WcfService1.IService1" behaviorConfiguration="webbev"></endpoint>
<endpoint address="" binding="webHttpBinding" contract="WcfService1.IService1" behaviorConfiguration="webbev" bindingConfiguration="myhttpsbinding"></endpoint>
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"></endpoint>
<host>
<baseAddresses>
<add baseAddress="http://localhost:11010"/>
<add baseAddress="https://localhost:11011"/>
</baseAddresses>
</host>
</service>
</services>
<bindings>
<webHttpBinding>
<binding name="myhttpsbinding" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" sendTimeout="00:10:00" receiveTimeout="00:10:00">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" />
<security mode="Transport">
<transport clientCredentialType="None"></transport>
</security>
</binding>
</webHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="mybehavior">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="webbev">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
Поскольку протокол https защищен сертификатом, мы должны привязать сертификат к порту https для конечной точки https. (мы могли бы указать сертификат в модуле привязки IIS вместо CMD, если размещаем службу в IIS)
netsh http add sslcert ipport=0.0.0.0:11011 certhash=0000000000003ed9cd0c315bbb6dc1c08da5e6 appid={00112233-4455-6677-8899-AABBCCDDEEFF}
Запустите CMD с правами администратора и убедитесь, что сертификат установлен в хранилище сертификатов локального компьютера (certlm.msc). Параметр Certhash задает отпечаток сертификата. Параметр appid является идентификатором GUID, который может использоваться для идентификации приложения-владельца (находится в файле project.csproj)
<ProjectGuid>{56FDE5B9-3821-49DB-82D3-9DCE376D950A}</ProjectGuid>
https://learn.microsoft.com/en-us/windows/desktop/http/add-sslcert
https://learn.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-configure-a-port-with-an-ssl-certificate
Не стесняйтесь обращаться ко мне, если есть что-нибудь, с чем я могу помочь.
Комментарии:
1. Ах, это похоже на решение, которое может сработать для меня, я не размещаю через IIS, это служба Windows, размещенная самостоятельно. Можете ли вы отправить мне сообщение, пожалуйста, я не вижу способа связаться с вами напрямую.
2. могу ли я поговорить с вами о вашем решении?
3. Извините за более поздний ответ. Я в отпуске, пожалуйста, ответьте мне на ваш вопрос.
Ответ №3:
Https работает только на порту 443. поэтому вам лучше создать свой виртуальный хост в теге SSL script в конфигурации вашего сервера. Или вы также можете передать свой запрос через прокси с http:// порта (8888) на https: // (порт: 443)
Комментарии:
1. Можете ли вы рассказать о том, как выполнить передачу прокси-сервера в c # Windows, самостоятельно размещенной службе wcf dll?
2. SSL никоим образом не привязан к порту 443. У нас есть https-сайты, на которых запущен домен.com:6579
3. Это то, о чем я подумал, я видел команды командной строки для привязки его к другому порту. Теперь я должен выяснить, как это сделать для моей службы и избежать необходимости открывать cmd вручную и выполнять это программно
4. Только 443?? вы уверены