我正在开发一个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配置。
答案 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