多年来,我参与了一些C#项目,通常规则从项目类型到项目类型是一致的。但是,在启动WCF Webservice项目后,我发现事情有点不同。我必须验证传入的XML到模式。我已经从项目根目录XSD创建了一个用于存储模式的文件夹。在以前的项目中,当引用文件夹中的XSD时,我使用了这样的东西:
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方法失败。
BTW,此时XSD文件夹不在WCF项目中。我添加了一个类库项目(上面的代码当前所在的项目),这就是文件夹和文件所在的位置。我希望这可以消除临时目录问题,但它没有。
任何想法我做错了什么?提前谢谢。
答案 0 :(得分:0)
WCF是一个非常强大的框架,但WCF的核心概念之一是服务定义从通信通道的实现细节中抽象出来。这意味着WCF服务不知道用于描述其内容的XSD文件,或者甚至根本不使用XSD文件(服务绑定不一定使用SOAP)。
如果您尝试遵循现有协议,或者您尝试自定义复杂协议的一个方面(其中协议的每个其他方面都符合Web标准),WCF的效果非常好。然而,听起来你正在做的事情比那更糟糕和肮脏。
如果您发现必须以非标准方式直接处理SOAP消息,则WCF可能不是该作业的最佳工具。我建议您考虑使用其他服务实现策略,例如HttpHandler或旧的asmx文件。基于Asmx的Web服务远不如WCF那么复杂,但正是这种缺乏复杂性使得它们对非标准协议更加灵活。
答案 1 :(得分:0)
我认为,如果由于某种原因,你有问题通过文件系统访问XSD,那么我很可能将它们作为资源嵌入到程序集中。你所要做的就是使用一个自定义解析器(从它的声音来看,这些XSD似乎没有使用包含/导入;他们这样做,自定义解析器绝对是要走的路)...