2013-01-15 83 views
2

我想寫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(); 
} 

我還在尋找更詳細的解釋,爲什麼它的工作這樣...

+1

,你可以把你的服務主機的web.config也。 –

+0

元數據不是默認啓用的。這是一個額外的端點和行爲。 – Aphelion

+0

爲什麼我需要元數據,如果我不打算從它生成的客戶端? – shytikov

回答

1

嘗試添加到您的端點的行爲WebHttpBehavior,這樣

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

它似乎有所幫助。錯誤消失。 – shytikov

0

這看起來有點奇怪,你ServiceContract屬性直接定義的類實現你的服務。通常你會在定義服務的接口上定義它。例如這裏: -
MSDN ServiceContractAttribute

+0

這是不好的。但是技術上真的很重要嗎?它不僅僅是使用反射來解析屬性嗎? – Aphelion

+2

我不確定,你真的應該有用OperationContract裝飾的方法。這可能是你錯誤的原因。沒有服務合同是'聲明'你的信息。這裏有一篇關於這個異常的SO文章:http:// stackoverflow。com/questions/5487791/wcf-contractfilter -move-at-the-endpointdispatcher-exception –

0

要啓用元數據交換需要添加ServiceMetadataBehavior就這樣

ServiceMetadataBehavior serviceBehaviour = new ServiceMetadataBehavior() { HttpGetEnabled = true, HttpGetUrl = new Uri(String.Format("{0}/mex", endpointUrl)) }; 
Host.Description.Behaviors.Add(serviceBehaviour); 

然後使用localhost:2535/MEX檢索服務元數據。如果它成功了,看看你的測試方法是否包含在元數據中。如果失敗嘗試配置WCF tracing以獲得更詳細的和用戶友好的錯誤消息。 還要確保您標記您OperationContract特性的方法。

希望它有幫助。

+0

該方法在元數據中可見。 – shytikov