2

我正在尝试编写 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();
}

我仍在寻找更详细的解释为什么它会以这种方式工作......

4

3 回答 3

1

尝试添加到您的端点的行为 WebHttpBehavior,像这样

host.AddServiceEndpoint(typeof(Proxy), binding, uri).Behaviours.Add(new WebHttpBehavior());
于 2013-01-15T15:09:42.013 回答
0

ServiceContract您的属性直接在实现您的服务的类上定义,这看起来有点奇怪。通常你会在定义服务的接口上定义它。此处示例:-
MSDN ServiceContractAttribute

于 2013-01-15T13:17:15.837 回答
0

要启用元数据交换,您需要ServiceMetadataBehavior像这样添加

ServiceMetadataBehavior serviceBehaviour = new ServiceMetadataBehavior() { HttpGetEnabled = true, HttpGetUrl = new Uri(String.Format("{0}/mex", endpointUrl)) }; 
Host.Description.Behaviors.Add(serviceBehaviour);

然后使用 localhost:2535/mex 检索服务元数据。如果成功,请查看您的 Test 方法是否包含在元数据中。如果失败,请尝试配置WCF 跟踪以获取更详细和用户友好的错误消息。还要确保你用 OperationContract 属性标记了你的方法。

希望能帮助到你。

于 2013-01-15T14:57:06.657 回答