将 XSD 存储在 WCF 网络服务中

Store XSD inside WCF webservice

我正在开发一个 WCF Web 服务,它始终且只接收 XML。

所以我需要使用他们的 XSD 验证输入 XML。问题是,我可以将它们保存在网络服务中吗?在本地,我可以通过相对路径访问我手动创建的 IIS Express 根文件夹中的 XSD 文件。我尝试在 VS 项目中添加 XSD 文件,但我无法在运行时找到它们。

我正在这样使用 Shemas:Image1 Link

IIS XSD'd 文件夹路径解决方法:Image2 Link

目前,它工作正常,问题是当我尝试在互联网上的某个地方部署服务时。
谢谢。

tl;dr:我可以在部署 Web 服务时发送一些 XSD 还是根本不可能?

一种方法是在您的配置文件中使用一个应用程序设置,该设置将包含一个基本文件位置,例如:

<appSettings>
    <add key="BaseDir" value="C:\your\folder\names" />
</appSettings>

然后在你的程序中,当你需要一个文件时,你会做这样的事情:

string fileLocation = System.Configuration.ConfigurationManager.AppSettings["BaseDir"] +
                           @"\your\file\location\file.xsd";

要使用 System.Configuration.ConfigurationManager,您需要添加对 System.Configuration 的引用。

您可以将 XSD 添加为资源,然后从程序集中加载它。将 XSD 添加到您的项目,并在 "Properties Explorer" 下,将 "Build Action" 设置为 "Embedded Resource"。然后您可以使用以下命令读取文件:

var schemaSet = new XmlSchemaSet();
schemaSet.Add("", XmlReader.Create(typeof(SomeClassInTheSameAssembly).Assembly
    .GetManifestResourceStream("Full.Namespace.XsdName.xsd")));

有关更多信息,请参阅 Working with Embedded Resources or Loading XmlSchema files out of Assembly Resources

属于您的解决方案的文件应该是物理上的一部分。一旦出现这种情况,当 WCF 服务是自托管时,您可以使用例如 HostingEnvironment.MapPath; or look at the answers to this question. Note that there is a possible issue 和 HostingEnvironment.MapPath。

一个可能的解决方案是这个方法:

public static string MapPath(string path)
{
    if (HttpContext.Current != null)
        return HttpContext.Current.Server.MapPath(path);

    return HostingEnvironment.MapPath(path);
}

参数 path 需要采用 "~/XSD/MyFile.xsd" 格式,文件夹 "XSD" 位于 WCF 服务的根目录中。

切勿在 c:\program files (x86)\iis express 中创建文件夹。