我想寫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不匹配的消息。這可能是因爲合同不匹配(發件人和收件人之間的操作不匹配)或發件人和收件人之間的綁定/安全性不匹配。檢查發送方和接收方是否有相同的合同和相同的綁定(包括安全要求,例如消息,傳輸,無)。
我不明白我在想什麼,坦率地說......非常感謝幫助我重新找回正確的軌道。
編輯:通過向端點明確添加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也。 –
元數據不是默認啓用的。這是一個額外的端點和行爲。 – Aphelion
爲什麼我需要元數據,如果我不打算從它生成的客戶端? – shytikov