我正在尝试编写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();
}
我仍然在寻找更详细的解释,为什么它会这样工作......
答案 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属性标记了方法。
希望它有所帮助。