在我的业余时间里,我一直在和这个人争斗好几个星期,决心不转向这个美妙的社区.但是我的精神被打破了.所以......
我创建了一个WCF服务,并尝试在控制台应用程序中托管它,以便使用TCP端点.
我有一个包含合同和svc文件的项目.我有另一个项目,其中包含一个Console应用程序,它引用了第一个提到的项目.我的控制台应用程序的主要方法如下所示:
using (ServiceHost host = new ServiceHost(typeof(LicenceBucketWireService.LicenceBucketService)))
{
host.Open();
foreach (var endpt in host.Description.Endpoints)
{
Console.WriteLine("Enpoint address:\t{0}",endpt.Address);
Console.WriteLine("Enpoint binding:\t{0}",endpt.Binding);
Console.WriteLine("Enpoint contract:\t{0}\n", endpt.Contract.ContractType.Name);
}
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
直到这一点,一切都是花花公子:

当我尝试将该服务的服务引用添加到将要使用该服务的第3个完全独立的应用程序时,它会出错.当我尝试添加引用时,使用net.tcp:// localhost:49189/LicenceBucketWireService/LicenceBucketService/mex作为发现详细信息的地址,我收到错误:
无法识别URI前缀.元数据包含无法解析的引用:'net.tcp:// localhost:49189/LicenceBucketWireService/LicenceBucketService/mex'.元数据包含无法解析的引用:'net.tcp:// localhost:49189/LicenceBucketWireService/LicenceBucketService/mex'.如果在当前解决方案中定义了服务,请尝试构建解决方案并再次添加服务引用.
执行此任务时,控制台应用程序正在运行.app config包含以下元素:
<system.serviceModel>
<services>
<service name="LicenceBucketWireService.LicenceBucketService">
<clear />
<endpoint address="mex" binding="mexTcpBinding" contract="LicenceBucketWireService.ILicenceBucketService"
listenUriMode="Explicit">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="net.pipe://localhost/licenceBucketService"
binding="netNamedPipeBinding" bindingConfiguration="" contract="LicenceBucketWireService.ILicenceBucketService" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:49187/LicenceBucketWireService/LicenceBucketService" />
<add baseAddress="net.tcp://localhost:49189/LicenceBucketWireService/LicenceBucketService" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information, set the values below to false before deployment -->
<serviceMetadata httpGetEnabled="false" />
<!-- 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>
</system.serviceModel>
Run Code Online (Sandbox Code Playgroud)
小智 5
配置文件中的以下代码行:
<endpoint address="mex" binding="mexTcpBinding" contract="LicenceBucketWireService.ILicenceBucketService"
listenUriMode="Explicit">
Run Code Online (Sandbox Code Playgroud)
应该将合同作为"IMetadataExchange"而不是LicenceBucketWireService.ILicenceBucketService.
那应该解决这个问题.