使用Net.TCP时在客户端添加Web引用

时间:2009-06-30 08:55:36

标签: .net wcf binding reference tcp

我正在尝试在我的WCF服务中使用Net.TCP,这是自托管的,当我尝试通过Web引用将此服务引用添加到我的客户端时,我无法访问该服务的类和方法,可以任何有任何想法实现这一目标...... 在这种情况下我如何添加Web引用。我的服务有一个返回int的方法(GetNumber)。

WebService的:

public class WebService : IWebService
{
    public int GetNumber(int num)
    {
        return num + 1;
    }
}

服务合同代码:

[ServiceContract]
public interface IWebService
{
    [OperationContract]
    int GetNumber(int num);
}

WCF服务代码:

        ServiceHost host = new ServiceHost(typeof(WebService));
        host.AddServiceEndpoint(typeof(IWebService), new NetTcpBinding(), new Uri("net.tcp://" + Dns.GetHostName() + ":1255/WebService"));
        NetTcpBinding binding = new NetTcpBinding();
        binding.TransferMode = TransferMode.Streamed;
        binding.ReceiveTimeout = TimeSpan.MaxValue;
        binding.MaxReceivedMessageSize = long.MaxValue;
        Console.WriteLine("{0}", Dns.GetHostName().ToString());
        Console.WriteLine("Opening Web Service...");
        host.Open();
        Console.WriteLine("Web Service is running on port {0}",1255);
        Console.WriteLine("Press <ENTER> to EXIT");
        Console.ReadLine();

这很好用。唯一的问题是如何在我的客户端应用程序中添加此服务的引用。我只是想发送号码并收到答复。 任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:1)

问题是服务的元数据(您的服务描述)未导出,这就是Visual Studio无法创建代理类的原因。

这个link解释了如何通过更改xml配置文件或直接在代码中导出服务的元数据。

链接中提供的解决方案的编码版本仍然存在问题,我将在下面解释。

执行提供的代码时,会出现例外情况

The contract name 'IMetadataExchange' could not be found in the list of
contracts implemented by the service M6.Servico.GetCurve.GetCrvService.
Add a ServiceMetadataBehavior to the configuration file or to the ServiceHost
directly to enable support for this contract.

要解决这个问题,我只是改变了顺序。首先,创建行为,设置其属性并将其添加到主机的行为中。之后,添加端点,包括mexBinding

ServiceHost host = new ServiceHost(
    typeof(MyService),
    new Uri("http://localhost:8080/MyService"),
    new Uri("net.tcp://localhost:9000/MyService"));

ServiceMetadataBehavior metadataBehavior =
    new ServiceMetadataBehavior();
metadataBehavior.HttpGetEnabled = true;
host.Description.Behaviors.Add(metadataBehavior);

host.AddServiceEndpoint(
    typeof(IMyService),
    new WSHttpBinding(),
    "");
host.AddServiceEndpoint(
        typeof(IMyService),
    new NetTcpBinding(),
    "");
Binding mexBinding = MetadataExchangeBindings.CreateMexTcpBinding();
host.AddServiceEndpoint(
    typeof(IMetadataExchange),
    mexBinding,
    "net.tcp://localhost:9000/MyService/mex");

答案 1 :(得分:0)

您的客户端必须将您的Web服务的代理作为一个类,以便它可以实例化它并使用它来调用您的Web服务方法。

阅读here

答案 2 :(得分:0)

1)服务和客户端是否在同一台机器上运行,如果不是防火墙阻塞通信?

2)您是否尝试过使用svcutil来生成客户端类(然后可以在客户端应用程序中引用它?

答案 3 :(得分:0)

只需输入visual studio的服务引用区域即可配置net.tcp服务器的基地址(visual studio不会自动发现基于tcp协议的服务器,因此您可以手动指向地址)