尽管阅读了一些帖子,例如(This one seems popular)我似乎无法将我的服务公开为多个兼容SOAP和REST协议的端点 - 我的问题似乎与
Factory="System.ServiceModel.Activation.WebServiceHostFactory"
服务代码隐藏页面中的元素。
如果我将其删除,我的SOAP端点工作正常,但找不到我的JSON端点。如果我将该行放入,我的REST端点会像鸟一样唱歌,而SOAP端点会导致Service.svc页面上出现“Endpoint not found”。
我的操作似乎以标准方式设置,例如:
[OperationContract]
[WebGet(UriTemplate = "/GetData", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
string GetData();
配置文件
<endpoint address="rest" binding="webHttpBinding" contract=".IMeterService" behaviorConfiguration="REST" />
<endpoint address="soap" binding="wsHttpBinding" contract="IMeterService" bindingConfiguration="secureBasic" />
<behavior name="REST">
<webHttp />
</behavior>
我怎样才能做到这一点?有没有办法设置REST端点没有 System.ServiceModel.Activation.WebServiceHostFactory属性?
提前致谢。
答案 0 :(得分:5)
如果未在.svc文件中指定任何工厂,则所有端点都将来自web.config文件 - WCF将尝试查找<system.serviceModel / service>
属性与name
属性匹配的basicHttpBinding
元素服务类的完全限定名称。如果找不到,则会添加默认端点(使用<service>
,除非您更改了默认映射)。这似乎是你所面临的。确认Service
元素的“name”属性与.svc文件中namespace MyNamespace
{
[ServiceContract]
public interface ITest
{
[OperationContract]
string Echo(string text);
}
public class Service : ITest
{
public string Echo(string text)
{
return text;
}
}
}
属性的值匹配,并且您应该让两个端点正常工作。
您可以尝试做的另一件事是在服务中启用跟踪(level = Information)以查看在服务上实际打开了哪些端点。下图:
此示例的服务器并不重要:
<% @ServiceHost Service="MyNamespace.Service" Language="C#" debug="true" %>
Service.svc没有指定工厂:
<configuration>
<system.diagnostics>
<sources>
<source name="System.ServiceModel" switchValue="Information, ActivityTracing"
propagateActivity="true">
<listeners>
<add type="System.Diagnostics.DefaultTraceListener" name="Default">
<filter type="" />
</add>
<add name="ServiceModelTraceListener">
<filter type="" />
</add>
</listeners>
</source>
</sources>
<sharedListeners>
<add initializeData="C:\temp\web_tracelog.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
name="ServiceModelTraceListener" traceOutputOptions="Timestamp">
<filter type="" />
</add>
</sharedListeners>
<trace autoflush="true"/>
</system.diagnostics>
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="Web">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
<services>
<service name="MyNamespace.Service">
<endpoint address="basic" binding="basicHttpBinding" bindingConfiguration=""
name="basic" contract="MyNamespace.ITest" />
<endpoint address="web" behaviorConfiguration="Web" binding="webHttpBinding"
bindingConfiguration="" name="web" contract="MyNamespace.ITest" />
</service>
</services>
</system.serviceModel>
</configuration>
web.config定义了两个端点,它们显示在跟踪中:
{{1}}
请注意,侦听器中显示了一个额外的侦听器,它是来自WCF的“帮助页面”(当您浏览它时,它告诉该服务没有启用元数据)。
您可以尝试将此设置与您的设置进行比较,或者从这个简单的设置开始,然后开始添加您的组件,直到遇到问题为止。这将有助于隔离问题。
祝你好运!