我刚下载并运行了Microsoft WCF示例中的net.tcp绑定示例: WF_WCF_Samples \ WCF \基本\绑定\净\的Tcp \默认\ CS
我打开解决方案并重建它,从server / bin目录启动服务器,从client / bin目录启动客户端,一切正常。
我向service.cs添加了一个新函数,然后从client.cs调用它。但是visual studio给出了这个错误: 'Microsoft.Samples.NetTcp.CalculatorClient'不包含'AddAndDouble'的定义,也没有接受第一个类型为'Microsoft.Samples.NetTcp.CalculatorClient'的扩展方法'AddAndDouble'(你是否缺少using指令)或汇编参考?)
我假设它给出了这个错误,因为我的generatedClient.cs文件现在已经过时了,所以我试图运行svcutil来生成一个新的generatedClient.cs文件。
但是当我运行svc util时,这就是它所说的:
c:\ Program Files \ Microsoft Visual Studio 9.0 \ VC> svcutil.exe net.tcp:// localhost: 9000 / servicemodelsamples /服务/
Microsoft(R)服务模型元数据工具 [Microsoft(R)Windows(R)Communication Foundation,Version 3.0.4506.648] 版权所有(c)Microsoft Corporation。保留所有权利。
尝试从'net.tcp:// localhost:9000 / servicemodelsampl下载元数据 es / service /'使用WS-Metadata Exchange。此URL不支持DISCO。 Microsoft(R)服务模型元数据工具 [Microsoft(R)Windows(R)Communication Foundation,Version 3.0.4506.648] 版权所有(c)Microsoft Corporation。保留所有权利。
错误:无法从net.tcp获取元数据:// localhost:9000 / servicemodelsamples / 服务/
如果这是您已加入的Windows(R)Communication Foundation服务 请检查您是否已在指定的addr处启用元数据发布 ESS。有关启用元数据发布的帮助,请参阅MSDN文档 离子http://go.microsoft.com/fwlink/?LinkId=65455。
WS-Metadata Exchange错误 URI:net.tcp:// localhost:9000 / servicemodelsamples / service /
Metadata contains a reference that cannot be resolved: 'net.tcp://localhost:
9000 / servicemodelsamples /服务/'.
The socket connection was aborted. This could be caused by an error processi
您的消息或远程主机超出接收超时或un 网络资源问题。本地套接字超时为'00:04:59.9687500'。
An existing connection was forcibly closed by the remote host
如果您需要更多帮助,请输入“svcutil /?”
所以,我通过这样做检查了服务器正在监听: netstat / an |找/我“9000” TCP 0.0.0.0:9000 0.0.0.0:0 LISTENING
任何想法我做错了什么?
答案 0 :(得分:4)
该示例中的服务不会公开任何可由svcutil等工具使用的元数据端点。如果您更改服务实现以添加元数据端点(请参阅下文),则svcutil应该可以使用它。
// Host the service within this EXE console application.
public static void Main()
{
// Create a ServiceHost for the CalculatorService type.
using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService),
new Uri("net.tcp://localhost:9000/servicemodelsamples/service")))
{
ServiceMetadataBehavior smb =
serviceHost.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (smb == null) serviceHost.Description.Behaviors.Add(
new ServiceMetadataBehavior());
serviceHost.AddServiceEndpoint(typeof(IMetadataExchange),
MetadataExchangeBindings.CreateMexTcpBinding(), "mex");
serviceHost.AddServiceEndpoint(typeof(ICalculator),
new NetTcpBinding(), "");
// Open the ServiceHost to create listeners
// and start listening for messages.
serviceHost.Open();
// The service can now be accessed.
Console.WriteLine("The service is ready.");
Console.WriteLine("Press <ENTER> to terminate service.");
Console.WriteLine();
Console.ReadLine();
}
}
答案 1 :(得分:1)
尝试通过配置公开元交换端点:
<endpoint address="mexTcp"
binding="mexTcpBinding"
contract="IMetadataExchange" />
<endpoint address="mexWS"
binding="mexHttpBinding"
contract="IMetadataExchange" />
而不是以编程方式。
答案 2 :(得分:0)
这里只是预感,因为你没有发布任何代码。您的Service.cs文件是否实现了IService?如果是这样,你是否将AddAndDouble方法添加到IService文件?
示例:
[ServiceContract]
public interface IService
{
[OperationContract]
double AddAndDouble(double x, double y);
}
public interface Service: IService
{
// Implement the operation contract here
public double AddAndDouble(double x, double y)
{
// Your code goes here
}
}
如果没有,请进行这些更改,重建服务,然后运行svcutil.exe。