如何? WCF customBinding over Https

我正在尝试在我们面向外部的网络场上设置一个内部使用的 WCF 服务(我们内部没有网络场,我需要这个服务来进行故障转移和负载平衡)。

要求:

  • PerSession 状态,因为我们需要服务为每个会话保留可变数据。
  • HTTPS。经过大量谷歌搜索后,我读到我需要创建一个 customBinding,我已经完成了,但不确定它是否正确。
  • 更大的消息大小,因为参数之一是 byte[] 数组,最大可以为 5mb。
  • 无需手动编辑客户端 app.config。即,我需要开发人员只添加服务引用,然后开始使用该对象,而不需要对 app.config 进行繁琐的更改。

注意:我之前已经让这个服务在 HTTP 下正确工作(使用 wsHttpBinding)。我也让它在 HTTPS 下工作,但它不支持 PerSession 状态,并且每个函数调用都会丢失内部变量值。

我目前从测试工具中收到此错误:

Could not find default endpoint element that references contract 'AppMonitor.IAppMonitorWcfService' in the ServiceModel client configuration section. This might be because no configuration file was found for your application, or because no endpoint element matching this contract could be found in the client element.

注意:该错误是在测试工具 EXE 上出现的,它在服务引用下直接引用了 WCF 服务。这不是 exe 引用另一个对象的问题,然后引用了我读过的 WCF 服务。

浏览到 URL 时 WSDL 正确显示。

网络配置:

  <system.serviceModel>
    <services>
      <service name="AppMonitor.AppMonitorWcfService" behaviorConfiguration="ServiceBehavior">
        <endpoint address="" binding="customBinding" bindingConfiguration="EnablePerSessionUnderHttps" contract="AppMonitor.IAppMonitorWcfService"/>
        <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
      </service>
    </services>

    <bindings>
      <customBinding>
        <binding name="EnablePerSessionUnderHttps" maxReceivedMessageSize="5242880">
          <reliableSession ordered="true"/>
          <textMessageEncoding>
            <readerQuotas maxDepth="64" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          </textMessageEncoding>
          <httpsTransport authenticationScheme="Anonymous" requireClientCertificate="false"/>
        </binding>
      </customBinding>
    </bindings>

    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <serviceMetadata httpsGetEnabled="true" httpGetEnabled="false"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

EXE 的 App.config(添加服务参考时自动生成):

<configuration>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="CustomBinding_IAppMonitorWcfService" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                    allowCookies="false">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="true" />
                    <security mode="Transport">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="Windows" negotiateServiceCredential="true"
                            establishSecurityContext="true" />
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <client />
    </system.serviceModel>
</configuration>

我不确定为什么 app.config 显示 wsHttpBinding?这不应该是customBinding吗?我真的不想编辑 app.config,因为该服务将被数十名开发人员使用,我希望他们能够添加服务参考,然后他们就走了......

使用 VS2008、.NET 3.51。我认为服务器是IIS7,Win Server 2008,如果需要可以确认。

stack overflow How to? WCF customBinding over Https
原文答案

答案:

作者头像

好的,你的问题是你没有为你的服务定义一个地址。记住端点的ABC:Address-Binding-Contract。

您需要为服务定义一个地址,该地址几乎由您的 .svc 文件管理,并且可以从 IIS 中浏览该文件。无论该 .svc 文件的 URL 是什么,您都可以附加您定义的地址(在您的情况下为空字符串),然后将其添加到顶部。因此,如果我将 myservice.svc 文件放在根目录中,它将变为

https://localhost/myservice.svc/<ServiceAddress>

在您的情况下是 ServiceAddress="" ,所以 URL 是 https://localhost/myservice.svc/

有关更多信息,请参阅 here