无法启动基于tcp的WCF服务

时间:2014-11-18 10:05:54

标签: c# .net web-services wcf tcp

我正在开发一个tcp基本WCF服务,我在尝试在主机应用程序中启动服务时遇到了这个臭名昭着的WCF异常:

  

System.ServiceModel.dll中出现未处理的“System.InvalidOperationException”类型异常

     

其他信息:服务'WcfServiceWas.MathService'没有应用程序(非基础结构)端点。这可能是因为没有为您的应用程序找到配置文件,或者因为在配置文件中找不到与服务名称匹配的服务元素,或者因为在服务元素中没有定义端点。

此问题之前已多次描述,建议的解决方案是将服务命名为与类库中定义的完全一样,问题是此解决方案对我不起作用。

托管服务拒绝启动服务的此配置有什么问题?

服务接口(IMathService.cs):

namespace WcfServiceWas
{
   [ServiceContract]
   public interface IMathService
   {
      [OperationContract]
      OperationResult Add(int x, int y);

      [OperationContract]
      int Subtract(int x, int y);
    }
}

服务实现(MathService.cs):

namespace WcfServiceWas
{
    public class MathService : IMathService
    {
        public OperationResult Add(int x, int y)
        {
            return new OperationResult { Result = new MyInteger { Value = x + y } };
        }

        public int Subtract(int x, int y)
        {
            return x - y;
        }
    }
}

Svc文件(MathService.svc):

<%@ ServiceHost Language="C#" Debug="true" Service="WcfServiceWas.MathService" CodeBehind="MathService.cs" %>

Web.Config中:

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
  </system.web>

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="WcfServiceWas.MathServiceBehavior" >
            <serviceMetadata httpGetEnabled="false" />
            <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
      <services>
        <service name="WcfServiceWas.MathService" behaviorConfiguration="WcfServiceWas.MathServiceBehavior" >
            <endpoint contract="WcfServiceWas.IMathService" binding="netTcpBinding" address="" />
            <endpoint contract="IMetadataExchange" binding="mexTcpBinding" address="mex" />
            <host>
                <baseAddresses>
                    <add baseAddress="net.tcp://localhost:999/MathServiceX/"/>
                </baseAddresses>
            </host>
        </service>
      </services>
  </system.serviceModel>
</configuration>

服务主持人:

class Program
{
    static void Main(string[] args)
    {
        using (var myServiceHost = new ServiceHost(typeof(MathService)))
        {
            myServiceHost.Open();
        }
    }
}

更新:托管应用程序的app.config也必须包含wcf配置。

1 个答案:

答案 0 :(得分:1)

您需要定义绑定部分,在<system.serviceModel>下添加以下<bindings>配置:

<bindings>
  <netTcpBinding>
    <binding name="netTcpBindingConfiguration" sendTimeout="00:01:00">
      <security mode="None" />
    </binding>
  </netTcpBinding>
</bindings>

并编辑行<endpoint contract="WcfServiceWas.IMathService"以在其中添加绑定配置,如下所示:

<endpoint contract="WcfServiceWas.IMathService"
          binding="netTcpBinding" 
          bindingConfiguration="netTcpBindingConfiguration" 
          address="" />

保存这些配置更改并重新启动服务,现在应该可以正常工作。

<强>更新

因此,对于自托管应用程序来说,WCF的配置必须位于主机本身的app.config中,并且该部分不必出现在System.ServiceModel中,因为它将采用默认绑定,msdn文档说明了这一点

http://msdn.microsoft.com/en-us/library/ee530014%28v=vs.110%29.aspx