[c#] .NET自动生成的Web服务客户端:如何避免从W3C请求模式?


Answers

我需要XmlResolver,所以tamberg的解决方案不起作用。 我通过实现自己的XmlResolver解决了这个问题,它从嵌入式资源中读取必要的模式,而不是下载它们。

顺便说一下,这个问题与自动生成的代码没有任何关系。

Web服务客户端有另一个实现文件,包含这样的东西:

public partial class [...]WebServiceClientType
  {
    private static readonly XmlSchemaSet _schema;

    static KeyImportFileType()
    {
      _schema = new XmlSchemaSet();
      _schema.Add(null, XmlResourceResolver.GetXmlReader("http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd"));
      _schema.Add(null, XmlResourceResolver.GetXmlReader("http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/xenc-schema.xsd"));
      _schema.Compile();
    }

这是这个类构造失败了。

Question

我有一个使用wsdl.exe工具从wsdl文件中自动生成的.NET Web服务客户端。

当我第一次实例化生成的类,它开始从w3.org和其他请求一堆文件。 第一个是http://www.w3.org/2001/XMLSchema.dtd

除了不想给w3.org带来不必要的流量外,我还需要能够运行应用程序,而不需要连接到互联网(网络服务是一种“Intra-web-service”)。

任何人都知道解决方案

如果有帮助,这里是我没有互联网时得到的堆栈跟踪:

"An error has occurred while opening external DTD 'http://www.w3.org/2001/XMLSchema.dtd': The remote name could not be resolved: 'www.w3.org'"

   at System.Net.HttpWebRequest.GetResponse()
   at System.Xml.XmlDownloadManager.GetNonFileStream(Uri uri, ICredentials credentials)
   at System.Xml.XmlDownloadManager.GetStream(Uri uri, ICredentials credentials)
   at System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri, String role, Type ofObjectToReturn)
   at System.Xml.XmlTextReaderImpl.OpenStream(Uri uri)
   at System.Xml.XmlTextReaderImpl.DtdParserProxy_PushExternalSubset(String systemId, String publicId)

   at System.Xml.XmlTextReaderImpl.Throw(Exception e)
   at System.Xml.XmlTextReaderImpl.DtdParserProxy_PushExternalSubset(String systemId, String publicId)
   at System.Xml.XmlTextReaderImpl.DtdParserProxy.System.Xml.IDtdParserAdapter.PushExternalSubset(String systemId, String publicId)
   at System.Xml.DtdParser.ParseExternalSubset()
   at System.Xml.DtdParser.ParseInDocumentDtd(Boolean saveInternalSubset)
   at System.Xml.DtdParser.Parse(Boolean saveInternalSubset)
   at System.Xml.XmlTextReaderImpl.DtdParserProxy.Parse(Boolean saveInternalSubset)
   at System.Xml.XmlTextReaderImpl.ParseDoctypeDecl()
   at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
   at System.Xml.XmlTextReaderImpl.Read()
   at System.Xml.Schema.Parser.StartParsing(XmlReader reader, String targetNamespace)
   at System.Xml.Schema.Parser.Parse(XmlReader reader, String targetNamespace)
   at System.Xml.Schema.XmlSchemaSet.ParseSchema(String targetNamespace, XmlReader reader)
   at System.Xml.Schema.XmlSchemaSet.Add(String targetNamespace, XmlReader schemaDocument)
   at [...]WebServiceClientType..cctor() in [...]



感谢坦伯格,你用简洁而正确的答案为我节省了大量的时间。 我没有意识到默认的解析器会上网。 检查MSDN是国家 -

XmlResolver是System.Xml命名空间中所有类的默认解析器。 你也可以创建你自己的解析器...

我已经实现了你的答案,将解析器设置为NULL,从而解决了问题并减少了网络开销。

XmlReader r = ...r.XmlResolver = null; // prevent xsd or dtd parsing

再次感谢安迪




Links