你能在代码中做NetTcpBinding吗?你应该?

Sha*_*ica 13 c# wcf nettcpbinding

WCF newbie here ...我正在尝试使用NetTcpBinding自托管WCF服务.基于MSDN"操作方法"教程,我已经完成了代码中的所有绑定,然后我将其从WsHttpBinding更改为NetTcpBinding,现在看起来像这样:

var baseAddress = new Uri("net.tcp://localhost:8000/MyWebService");
var selfHost = new ServiceHost(typeof(ConcreteWebService), baseAddress);
try {
  var binding = new NetTcpBinding();
  binding.Security.Mode = SecurityMode.Message;
  selfHost.AddServiceEndpoint(typeof(IWebService), binding, "TRWebService");
  selfHost.Open();
  Console.WriteLine("The service is ready at {0}", baseAddress.AbsoluteUri);
  Console.WriteLine("Press <ENTER> to terminate service.");
  Console.WriteLine();
  Console.ReadLine();

  selfHost.Close();
} catch (CommunicationException ce) {
  Console.WriteLine("An exception occurred: {0}", ce.Message);
  selfHost.Abort();
}
Run Code Online (Sandbox Code Playgroud)

事实是,教程然后说你必须运行svcutil.exe来为客户端生成代理...但是由于我切换到NetTcpBinding,svcutil不再工作 - 无法检测我的服务.我搜索了这个问题,发现NetTcpBinding的每一个例子都在app.config文件中进行设置,而不是在代码中,并且它们都添加一个名为"Mex"的端点,绑定类型为"mexTcpBinding".在代码中似乎没有任何等效的东西.

那么,我是否必须更改我的项目以使用app.config,并放弃基于代码的方法?任何人都可以向我解释Mex是什么,为什么我需要它,以及为什么它(显然)不能在代码中调用 - 或者它是否可以,如何或为什么不鼓励?一般来说,何时使用app.config以及何时使用WCF服务代码更好?

mar*_*c_s 20

如果您使用netTcpBinding- 并且在"企业防火墙后"LAN环境中,这绝对是一个好主意 - 您还需要使用以下方式公开MEX端点(元数据交换)mexTcpBinding以便svcutil能够检测到并找到该服务.

MEX =元数据交换是WCF用于"公开宣传"服务内容的机制.如果你有一个MEX端点,那么像这样的实用程序svcutil可以查询和"发现"一个服务,例如找出它所公开的所有服务方法,关于它期望得到的参数等等.

要添加MEX端点,您也可以使用代码!类似这样的片段:

var mexBinding = MetadataExchangeBindings.CreateMexTcpBinding();
selfHost.AddServiceEndpoint(typeof(IMetadataExchange), mexBinding, "mex");
Run Code Online (Sandbox Code Playgroud)

如果没有MEX,您需要以某种方式"告诉"尝试使用您的服务的客户端您的服务提供什么,以便客户端可以确保使用适当的参数调用正确的方法.