【发布时间】:2012-12-29 14:01:47
【问题描述】:
我正在尝试编写 WCF 服务,其中一种方法将捕获所有请求。计划将其托管在独立的可执行文件中。这是合同:
[ServiceContract]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple, AddressFilterMode = AddressFilterMode.Any)]
public class Proxy
{
[WebInvoke(UriTemplate = "*", Method = "*")]
public string Test(Stream input)
{
return "Test";
}
}
这是托管代码:
static void Main(string[] args)
{
var uri = new Uri("http://localhost:2535/");
var binding = new WebHttpBinding();
var host = new ServiceHost(new Proxy(), uri);
host.AddServiceEndpoint(typeof(Proxy), binding, uri);
host.Open();
Console.ReadKey();
}
但是当我将浏览器指向localhost:2535 时,我只会看到有关服务的信息以及未启用元数据的事实。当我得到类似localhost:2535/bla-bla-bla/ 的错误时:
由于 EndpointDispatcher 的 ContractFilter 不匹配,接收方无法处理带有 Action '' 的消息。这可能是因为合约不匹配(发送方和接收方之间的操作不匹配)或发送方和接收方之间的绑定/安全不匹配。检查发送方和接收方是否具有相同的合同和相同的绑定(包括安全要求,例如消息、传输、无)。
坦率地说,我不明白自己错过了什么……非常感谢您帮助我重回正轨。
编辑:通过将WebHttpBehavior 行为显式添加到端点来解决。结果代码变成:
static void Main(string[] args)
{
var uri = new Uri("http://localhost:2535/");
var binding = new WebHttpBinding();
var host = new ServiceHost(new Proxy(), uri);
host.AddServiceEndpoint(typeof(Proxy), binding, uri).Behaviors.Add(new WebHttpBehavior());
host.Open();
Console.ReadKey();
}
我仍在寻找更详细的解释为什么它会以这种方式工作......
【问题讨论】:
-
你能不能把你的服务主机web.config也放上来。
-
默认情况下不启用元数据。这是一个额外的端点和行为。
-
如果我不打算从中生成客户端,为什么还需要元数据?
-
@NickRyan 我的可执行文件没有任何配置文件。一切都是通过代码完成的。