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 服务缓存所有请求的主要内容,如果未能解决你的问题,请参考以下文章