WCF服务缓存所有请求

时间:2013-01-15 12:58:24

标签: c# .net wcf

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

我仍然在寻找更详细的解释,为什么它会这样工作......

3 个答案:

答案 0 :(得分:1)

尝试添加到您的Endpoint的行为WebHttpBehavior,就像这样

host.AddServiceEndpoint(typeof(Proxy), binding, uri).Behaviours.Add(new WebHttpBehavior());

答案 1 :(得分:0)

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

答案 2 :(得分: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 tracing以获取更详细和用户友好的错误消息。 另外,请确保使用OperationContract属性标记了方法。

希望它有所帮助。