我正在尝试从IIS中运行两个WCF服务,一个是Web服务,一个是Net TCP绑定服务。
这是我的Web.config的模拟(我已经匿名化了服务名称):
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<services>
<service name="ServerService">
<endpoint address="ServerService"
binding="netTcpBinding"
bindingConfiguration=""
name="NetTcpEndPoint"
contract="IServerService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:8523/"/>
<add baseAddress="htt://localhost:8523/"/>
</baseAddresses>
</host>
</service>
<service name="MyWebService">
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration=""
name="AACCWSEndPoint"
contract="IMyWebService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8523/IMyWebService"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
当我在IDE中运行它时,它会打开一个在端口51953上运行的页面,我可以通过浏览到http://localhost:51953/WebService.svc?wsdl来获取Web服务的WSDL(注意端口不同)。 我似乎无法通过将端口更改为我在webconfig文件中指定的内容来获取WSDL(8523)。
当我将WcfTestClient应用程序指向“net.tcp:// localhost:8523 / ServerService时,它会给我一个错误,说它无法访问元数据,据我所知,我已配置(服务中的第二个终点)。
我在这里做错了什么?
更新
我已经尝试将项目属性上的端口号更改为8523,因为建议似乎没有用,我也尝试将mex端点的地址改为“ServerService \ mex”测试客户端花了一些时间流逝,但后来又抛出了以下错误:
错误:无法从中获取元数据 net.tcp:// localhost:8523 / ServerService如果这是一个Windows(R) 请访问您的Communication Foundation服务 检查您是否已在指定的位置启用元数据发布 地址。有关启用元数据发布的帮助,请参阅 MSDN文档在 http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata交流 错误URI:net.tcp:// localhost:8523 / ServerService元数据 包含无法解析的引用: '的net.tcp://本地主机:8523 / Server服务'。你试图创造 一个不支持.Net框架的服务的渠道。它是 可能是您遇到HTTP端点。预期 记录类型'PreambleAck',找到'72'。
我会继续挖掘,但我会感激任何帮助。
更新2:
我已将mex端点更改为mexTcpBinding: 这是服务标签:
<endpoint address="ServerServiceWS"
binding="wsHttpBinding"
bindingConfiguration=""
name="WSEndPoint"
contract="IServerService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex"
binding="mexTcpBinding"
contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:8523/"/>
<add baseAddress="http://localhost:8523/"/>
</baseAddresses>
</host>
</service>
仍然没有运气。为了确保我输入正确的url进入我正在使用的Url的测试人员:
net.tcp://localhost:8523/ServerService
我也试过:
net.tcp://localhost:8523/mex
和
net.tcp://localhost:8523/
所有这些都为我提供了以下错误的一些变体:
错误:无法从中获取元数据 net.tcp:// localhost:8523 / ServerService如果这是一个Windows(R) 请访问您的Communication Foundation服务 检查您是否已在指定的位置启用元数据发布 地址。有关启用元数据发布的帮助,请参阅 MSDN文档在 http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata交流 错误URI:net.tcp:// localhost:8523 / ServerService元数据 包含无法解析的引用: '的net.tcp://本地主机:8523 / Server服务'。你试图创造 一个不支持.Net框架的服务的渠道。它是 可能是您遇到HTTP端点。预期 记录类型'PreambleAck',找到'72'。
更新3
FWIW我认为我的WEb.config可能存在更大问题以下是目前的情况:
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<services>
<service name="ServerService">
<endpoint address=""
binding="netTcpBinding"
bindingConfiguration="DefaultBindingConfig"
name="NetTcpEndPoint"
contract="IServerService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex"
binding="mexTcpBinding"
contract="IMetadataExchange"
bindingConfiguration="mexBinding"/>
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:8523/"/>
</baseAddresses>
</host>
</service>
<service name="MyWebService">
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration=""
name="MyWSEndPoint"
contract="IMyWebService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange"
bindingConfiguration="mexHttpBinding"/>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8523/MyWebService"/>
</baseAddresses>
</host>
</service>
</services>
<bindings>
<netTcpBinding>
<binding name="DefaultBindingConfig"
maxConnections="5"
portSharingEnabled="true" >
</binding>
<binding name="mexBinding"
portSharingEnabled="true">
<security mode="None"></security>
</binding>
</netTcpBinding>
<mexTcpBinding>
<binding name="mexTcpBinding"/>
</mexTcpBinding>
<mexHttpBinding>
<binding name="mexHttpBinding"/>
</mexHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="ServerServiceBehaviour">
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true" />
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
<behavior name="MexBehaviour">
<serviceMetadata httpGetEnabled="true" policyVersion="Policy15"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
我可以浏览Webservice并允许我使用?wsdl获取WSDL但是如果我将Adddress http://localhost:8523/MyWebService放入WCF测试器中它也会抛出错误。
错误:无法从http://localhost:8523/MyWebService获取元数据 如果这是您的Windows(R)Communication Foundation服务 有权访问,请检查您是否已启用元数据发布 指定的地址。有关启用元数据发布的帮助,请 请参阅MSDN文档 http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata交流 错误URI:http://localhost:8523/MyWebService元数据包含 无法解决的引用: 的 'http://本地主机:8523 /为MyWebService'。发生错误 收到对http://localhost:8523/MyWebService的HTTP响应。 这可能是由于服务端点绑定不使用HTTP 协议。这也可能是由于HTTP请求上下文所致 由服务器中止(可能是由于服务关闭)。看到 服务器日志了解更多详情。底层连接已关闭: 接收时发生意外错误。无法从中读取数据 传输连接:强制关闭现有连接 由远程主机。现有连接被强制关闭 远程hostHTTP GET错误URI: http://localhost:8523/MyWebService下载时出错 的 'http://本地主机:8523 /为MyWebService'。请求因HTTP失败 状态404:未找到。
我认为问题与路径有关,或者我只是将错误的URL放入测试应用程序中。要么我还是没有正确配置元数据。
答案 0 :(得分:4)
对于HTTP端点,您需要reconfigure the Project Properties以便在使用IIS Express托管时在端口8523启动web.config定义的端点。使用特定端口(8523)代替自动分配端口(51953)。
对于TCP元数据,您需要支持启用TCP的mex端点(mexTcpBinding
)。
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
答案 1 :(得分:0)
必须在IIS上的不同端口上设置net.tcp和HTTP绑定。 它可以使用相同的端口或不同的端口进行测试。它将在第一种情况下崩溃。此外,您可以使用您想要的任何端口号。在这种情况下,TCP端口可以更改为8524.只是您不能在同一端口上使用两个单独的协议。另一方面,基址仅对自托管服务有意义。这里的基址由IIS中的URL确定。
答案 2 :(得分:0)
只是尝试保持原样,并在内部更改服务并将其粘贴到配置文件中,它应该可以正常工作。 测试net.tcp你可以使用SvcUtil.exe
<system.serviceModel>
<services>
<service name="MyWCFServices.HelloWorldService">
<endpoint
binding="netTcpBinding"
bindingConfiguration="ultra"
contract="MyWCFServices.IHelloWorldService"/>
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:8086/HelloWorldService.svc" />
<add baseAddress="http://localhost:8081/HelloWorldService.svc" />
</baseAddresses>
</host>
</service>
</services>
<bindings>
<netTcpBinding>
<binding name="ultra"
maxBufferPoolSize="2147483647"
maxBufferSize="2147483647"
maxReceivedMessageSize="2147483647"
portSharingEnabled="false"
transactionFlow="false"
listenBacklog="2147483647" >
<security mode="None">
<message clientCredentialType="None"/>
<transport protectionLevel="None" clientCredentialType="None"/>
</security>
<reliableSession enabled="false"/>
</binding>
</netTcpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>