我正在尝试在我的WCF服务中使用Net.TCP,这是自托管的,当我尝试通过Web引用将此服务引用添加到我的客户端时,我无法访问该服务的类和方法,可以任何有任何想法实现这一目标...... 在这种情况下我如何添加Web引用。我的服务有一个返回int的方法(GetNumber)。
public class WebService : IWebService
{
public int GetNumber(int num)
{
return num + 1;
}
}
[ServiceContract]
public interface IWebService
{
[OperationContract]
int GetNumber(int num);
}
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();
这很好用。唯一的问题是如何在我的客户端应用程序中添加此服务的引用。我只是想发送号码并收到答复。 任何人都可以帮助我吗?
答案 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协议的服务器,因此您可以手动指向地址)