WCF 服务缓存所有请求

Posted

技术标签:

【中文标题】WCF 服务缓存所有请求【英文标题】:WCF service caching all requests 【发布时间】: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 我的可执行文件没有任何配置文件。一切都是通过代码完成的。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

很糟糕。但这在技术上真的重要吗?是不是只用反射来解析属性? 我不确定,你真的应该用 OperationContract 装饰方法。这可能是你的错误的原因。没有服务合同“声称”您的信息。这里有一篇关于这个异常的 SO 文章:***.com/questions/5487791/…【参考方案3】:

要启用元数据交换,您需要像这样添加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 属性标记了你的方法。

希望对你有帮助。

【讨论】:

以上是关于WCF 服务缓存所有请求的主要内容,如果未能解决你的问题,请参考以下文章

WCF 413 请求实体太大 - 自托管 WebHttpBinding

WCF 不会序列化所有属性

内存缓存还是并发字典?

如何限制 WCF 服务的请求执行时间?

WCF 服务接受并发请求

WCF 限制请求