我正在尝试在我们面向外部的网络场上设置一个供内部使用的 WCF 服务(我们内部没有网络场,我需要此服务进行故障转移和负载平衡)。
要求:
注意:我之前已经让此服务在 HTTP 下正确工作(使用 wsHttpBinding)。 我也让它在 HTTPS 下工作,但它不支持 PerSession 状态,并且每次函数调用都会丢失内部变量值。
我目前从测试工具中收到此错误:
在 ServiceModel 客户端配置部分中找不到引用合约“AppMonitor.IAppMonitorWcfService”的默认端点元素。这可能是因为没有找到适用于您的应用程序的配置文件,或者因为在客户端元素中找不到与此合同匹配的端点元素。
注意:该错误是在 Test Harness EXE 上出现的,该 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? 这不应该是自定义绑定吗? 我真的不想编辑 app.config,因为该服务将由数十个开发人员使用,我希望他们能够添加服务引用,然后就可以了。
使用VS2008、.NET 3.51。 我认为服务器是IIS7,Win Server 2008,如果需要可以确认。
好的,您的问题是您尚未为您的服务定义地址。记住端点的 ABC:地址-绑定-契约。
您需要为服务定义一个地址,该地址几乎由 .svc 文件控制,并且可以从 IIS 浏览该文件。无论该 .svc 文件的 URL 是什么,您都可以附加您定义的地址(在您的情况下为空字符串),然后将其添加到顶部。因此,如果我将 myservice.svc 文件放在根目录中,它就会变成
https://localhost/myservice.svc/<ServiceAddress>
在你的情况下
ServiceAddress=""
所以URL是https://localhost/myservice.svc/
。
请参阅此处了解更多信息。