无法在wcf示例中的net.tcp示例上成功运行svcutil

时间:2011-10-25 01:27:55

标签: wcf net.tcp

我刚下载并运行了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

任何想法我做错了什么?

3 个答案:

答案 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。