我使用ADO.NET iSeries驱动程序连接c#应用程序中的IBM.Iseries数据库。我的WCF服务正在抛出错误
“HTTP无法注册URL http://+:80/Temporary_Listen_Addresses/771be107-8fa3-46f9-ac01-12c4d503d01e/,因为另一个应用程序正在使用TCP端口80。”
<system.serviceModel>
<client>
<endpoint address="http://localhost:8080/Design_Time_Addresses/DataAccessLayer/POEngine/"
binding="wsDualHttpBinding" bindingConfiguration="" contract="POServiceReference.IPOEngine"
name="MyPoBindings">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="http://localhost:8080/Design_Time_Addresses/DataAccessLayer/POEngine/"
binding="wsDualHttpBinding" bindingConfiguration="PoBindings1"
contract="POServiceReference.IPOEngine" name="PoBindings">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
</client>
<bindings>
<wsDualHttpBinding>
<binding name="PoBindings1" 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">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00" />
<security mode="Message">
<message clientCredentialType="Windows" negotiateServiceCredential="true"
algorithmSuite="Default" />
</security>
</binding>
</wsDualHttpBinding>
<wsHttpBinding>
<binding name="PoBindings" />
</wsHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="DataAccessLayer.POEngineBehavior"
name="DataAccessLayer.POEngine">
<endpoint address="" binding="wsDualHttpBinding" bindingConfiguration=""
name="PoBindings" contract="DataAccessLayer.IPOEngine">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/Design_Time_Addresses/DataAccessLayer/POEngine/" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="NewBehavior" />
</endpointBehaviors>
<serviceBehaviors>
<behavior name="DataAccessLayer.Service1Behavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
<behavior name="DataAccessLayer.POEngineBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors> </system.serviceModel>
在不使用任何IBM数据访问的情况下解决问题。正常的Hello World也会抛出错误。我需要更改端口地址
答案 0 :(得分:1)
“问题”是您正在使用wsDualHttpBinding,用于双工合同(服务器回调客户端)。你需要这个功能吗?如果这样做,您需要通过在绑定配置中指定clientBaseAddress
为客户端提供一个地址来监听。此外,您需要告知端点使用PoBindings1绑定配置。
WCF会自动将GUID附加到基地址,以确保它生成唯一的端点地址,但当然它需要一个可以侦听的端口号。有关配置部分的文档,请参阅this MSDN page。看起来应该大致如下:
<system.serviceModel>
<!-- client section omitted -->
<bindings>
<wsDualHttpBinding>
<binding name="PoBindings1"
clientBaseAddress="http://localhost:8080/Callbacks/">
<!-- extra config elements and attributes omitted -->
</binding>
</wsDualHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="DataAccessLayer.POEngineBehavior"
name="DataAccessLayer.POEngine">
<endpoint address=""
binding="wsDualHttpBinding"
bindingConfiguration="PoBindings1"
name="PoBindings" contract="DataAccessLayer.IPOEngine">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/Design_Time_Addresses/DataAccessLayer/POEngine/" />
</baseAddresses>
</host>
</service>
</services>
<!-- behaviors omitted -->
</system.serviceModel>
如果您使用双工合同,这就是服务合同的通常情况:
[ServiceContract(CallbackContract = typeof(IMyCallbackContract))]
interface IMyContract
{
[OperationContract]
void DoSomething();
}
interface IMyCallbackContract
{
[OperationContract]
void OnCallback();
}
如果您不需要回调功能,则应该使用WSHttpBinding或其他“简单”绑定之一。 Here是WCF附带的绑定类型列表。