2012-01-27 71 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似乎没有使用包含/导入;它们的确如此,自定义解析器肯定是要走的路)......

相关问题