2013-05-13 29 views
0

我試圖在wcf中使用XPath來阻止基於內容的路由。使用XPath的WCF路由:無效的限定名異常

我已創建包含服務合同和數據合同的類庫,如下所示。

[ServiceContract(Namespace = "http://orders/")] 
public interface IService5 
{ 
    [OperationContract] 
    string GetData(int value); 
} 

[DataContract] 
public class Quantity 
{ 
    [DataMember] 
    public int value1 { get; set; } 

} 

我創建了一個服務如下:

public class Service5 : IService5 
{ 
    public string GetData(int value) 
    { 
     return string.Format("You entered in service 5: {0}", value); 
    } 
} 

,我試圖基於「價值」來實現路由

在app.config中(內部路由器項目)我甲肝添加以下命名空間和XPath過濾器行

<namespaceTable> 
    <add prefix="cc" namespace="http:orders/Quantity/"/> 
</namespaceTable> 
<filters> 
    <filter name="All" filterType="XPath" filterData="cc://value1 &gt; 500 " /> 

但是,每當我運行代碼我得到一個異常'cc:// value1 > 500'作爲無效的限定名稱異常。

我該如何解決這個問題?

+0

Porque downvote? – 2013-05-14 08:44:13

回答

1

錯在這裏多事情:

  1. 上你似乎要應用的過濾器在您的服務合同沒有特色可言類Quantity,所以會在XML完全不存在用於過濾目的。
  2. 當服務合約命名空間啓動http://orders時,路由器配置中的命名空間開始http:orders
  3. 當您的路由器配置中的命名空間包含/Quantity時,服務協定命名空間不包含。
  4. 濾波器的xpath 的cc:// VALUE1是不是有效的xpath
  5. ---
+0

真的很感謝這麼快的回覆,真的很抱歉那些愚蠢的錯誤。正如你在第二點中提到的,我使用http://命令來訪問http:orders並從命名空間中刪除Quantity。仍然是在那裏。而且我也無法理解你的第一和第四點。你能簡單地解釋一下嗎? Pushkar – user2206336 2013-05-13 13:35:56

+0

主要問題是您似乎在過濾基於它的請求中不存在的消息屬性。所有其他問題都只是編碼問題。這是一個設計問題。您需要將數量類型放入您的請求中,然後才能按此值進行路由。 – 2013-05-13 13:39:28

+0

雅實際上我認爲這可能是序列化這就是爲什麼我把它放在屬性中的問題。實際上,在我原來的情況下,我沒有將數量作爲數據合同。我直接在XPath表達式中使用'value'(這是函數的參數)。 as filterData =「cc:// value > 500。但仍然顯示相同的例外情況。 – user2206336 2013-05-13 13:45:54

0

嘿的問題是在該行

filter name="All" filterType="XPath" filterData="cc://value1 &gt; 500 " 

它應該是

<filter name="All" filterType="XPath" filterData="//cc:value1 &gt; 500 " /> 

觀察cc://在你的代碼中。

這將解決你的問題