2012-01-27 90 views
0

多年來,我一直在處理幾個C#項目,並且通常從項目類型到項目類型的規則是一致的。但是啓動了一個WCF Webservice項目,我發現情況有點不同。我必須將傳入的XML驗證爲模式。我已經創建了一個脫離項目根目錄XSD的文件夾來存儲模式。在以前的項目中,一個文件夾中引用的XSD的時候,我用這樣的:如何在WCF Web服務應用程序中引用文件?

  XmlTextReader textReader = null; 
      XmlSchemaCollection xSchemaCollection = null; 
      XmlValidatingReader valReader = null; 

      string uri = string.Format(@"{0}\{1}", Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), XSDPath); 

      // text reader object 
      textReader = new XmlTextReader(uri); 
      xSchemaCollection = new XmlSchemaCollection(); 
      xSchemaCollection.Add(null, textReader); 

      // XML validator object 
      valReader = new XmlValidatingReader(strXMLDoc, XmlNodeType.Document, null); 

的XSD文件的屬性設置爲始終複製到目標文件夾。通常情況下,我得到一個有效的XSD路徑,事情進展得很好。但是在這個WCF Webservice項目中,XSD文件複製到的路徑是一個臨時目錄,並且我沒有得到有效的路徑。 xSchemaCollection.Add方法失敗。

順便說一句,此時XSD文件夾不在WCF項目中。我添加了一個類庫項目(上面的代碼當前駐留在其中),這就是文件夾和文件的位置。我預計這會消除臨時目錄問題,但事實並非如此。

任何想法我做錯了什麼?提前致謝。

+0

您是否試圖驗證WCF用於通信的XML?你是否通過WCF發送XML?這項服務的目的是什麼? – 2012-01-27 03:12:01

+0

其中,您使用的是舊技術。使用'XmlReader.Create()',而不是'new XmlTextReader()'。和'XmlValidatingReader()一樣' – 2012-01-27 08:06:06

回答

0

WCF是一個功能非常強大的框架,但WCF的核心概念之一是將服務定義從通信通道的實現細節中抽象出來。這意味着WCF服務不知道使用什麼XSD文件來描述其內容,或者甚至根本不使用XSD文件(服務綁定不一定使用SOAP)。

如果您試圖遵循現有協議,或者您嘗試自定義複雜協議的一個方面,其中協議的每個其他方面都符合Web標準,WCF會非常有效。但是,這聽起來像你正在做的事情比這更糟糕和骯髒。

如果您發現您必須以非標準方式直接處理SOAP消息,那麼WCF可能不是該作業的最佳工具。我建議你考慮使用其他的服務實現策略,比如HttpHandler或者一個好的舊的asmx文件。基於Asmx的Web服務遠沒有WCF那麼複雜,但它非常複雜,使得它們對於非標準協議更加靈活。

+0

謝謝,保羅。考慮到需求(我不得不在短時間內發佈測試版本),目前我在項目選擇方面受到了限制,但是一旦我們的下一輪測試完成,我可能會爲不同的體系結構提供一個案例。與此同時,我想我可以通過使用XSD的字符串表示來破解解決方案。 – user1172619 2012-01-27 16:04:37

0

我認爲,如果出於某種原因,您有問題通過文件系統訪問XSD,那麼我很可能會將它們作爲資源嵌入到程序集中。所有你需要做的就是使用一個自定義的解析器(從它的聲音來看,這些XSD似乎沒有使用包含/導入;它們的確如此,自定義解析器肯定是要走的路)......

相關問題