.NET يتم إنشاؤه تلقائيا عميل خدمة على شبكة الإنترنت: كيف يمكنني تجنب طلب المخططات من w3.org؟

StackOverflow https://stackoverflow.com/questions/217841

سؤال

ولدي عميل .NET خدمة الإنترنت التي تم تم تكوينها من ملف اختصار باستخدام معالجة أداة Wsdl.exe.

وعندما كنت أول مثيل الفئة التي تم إنشاؤها، ويبدأ لطلب مجموعة من الوثائق من w3.org وغيرها. أولاهما http://www.w3.org/2001/XMLSchema.dtd

وعلاوة على ذلك لا يريد أن يسبب حركة لا لزوم لها w3.org، ولست بحاجة إلى أن تكون قادرة على تشغيل التطبيق دون اتصال بالإنترنت (خدمة شبكة الإنترنت هي "البينية خدمة الإنترنت").

وأي شخص يعرف الحل؟

وإذا كان يساعد، وهنا هو تتبع مكدس الذاكرة المؤقتة أحصل عندما لا يكون لديك Internet:

"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 [...]
هل كانت مفيدة؟

المحلول 2

وأنا في حاجة الى XmlResolver، لذلك <وأ href = "https://stackoverflow.com/questions/217841/net-autogenerated-web-service-client-how-do-i-avoid-requesting-schemas-from- w3o # 218105 "> حل tamberg في لم تعمل تماما. I حلها من خلال تنفيذ بلدي XmlResolver الخاص أن قراءة المخططات اللازمة من الموارد المضمنة بدلا من تنزيلها.

والمشكلة لم يكن لديهم أي علاقة مع رمز يتم إنشاؤه تلقائيا، من جانب الطريق.

وكان الخدمة والعميل على شبكة الإنترنت ملف تطبيق آخر أن يرد شيئا من هذا القبيل:

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();
    }

وكان هذا الطبقة منشئ التي فشلت.

نصائح أخرى

وإذا كان لديك الوصول إلى XmlReader (أو XmlTextReader) يمكنك القيام بما يلي:

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

والتحيات، tamberg

وهنا حل بي. آمل أن ينقذ شخص من الحاجة إلى تصحيح من خلال الإطار. NET مثل اضطررت الى للعمل على أسس XmlUrlResolver. وسوف إما تحميل من مورد محلي (ملف RESX النص)، ذاكرة التخزين المؤقت، أو استخدام السلوك XmlUrlResolver الافتراضي:

using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Xml;
using System.Net;
using System.Net.Cache;
using System.IO;
using System.Resources;

namespace AxureExport {

    //
    // redirect URL resolution to local resource (or cache)
    public class XmlCustomResolver : XmlUrlResolver {

        ICredentials _credentials;
        ResourceManager _resourceManager;

        public enum ResolverType { useDefault, useCache, useResource };
        ResolverType _resolverType;

        public XmlCustomResolver(ResolverType rt, ResourceManager rm = null) {
            _resourceManager = rm != null ? rm : AxureExport.Properties.Resources.ResourceManager;
            _resolverType = rt;
        }

        public override ICredentials Credentials {
            set {
                _credentials = value;
                base.Credentials = value;
            }
        }

        public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn) {
            object response = null;

            if (absoluteUri == null)
                throw new ArgumentNullException(@"absoluteUri");

            switch (_resolverType) {
                default:
                case ResolverType.useDefault:                   // use the default behavior of the XmlUrlResolver
                    response = defaultResponse(absoluteUri, role, ofObjectToReturn);
                    break;

                case ResolverType.useCache:                     // resolve resources thru cache
                    if (!isExternalRequest(absoluteUri, ofObjectToReturn)) {
                        response = defaultResponse(absoluteUri, role, ofObjectToReturn);
                        break;
                    }

                    WebRequest webReq = WebRequest.Create(absoluteUri);
                    webReq.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.Default);
                    if (_credentials != null)
                        webReq.Credentials = _credentials;

                    WebResponse wr = webReq.GetResponse();
                    response = wr.GetResponseStream();
                    break;

                case ResolverType.useResource:                  // get resource from internal resource
                    if (!isExternalRequest(absoluteUri, ofObjectToReturn)) {
                        response = defaultResponse(absoluteUri, role, ofObjectToReturn);    // not an external request
                        break;
                    }

                    string resourceName = uriToResourceKey(absoluteUri);
                    object resource = _resourceManager.GetObject(resourceName);
                    if (resource == null)
                        throw new ArgumentException(@"Resource not found.  Uri=" + absoluteUri + @" Local resourceName=" + resourceName);

                    if (resource.GetType() != typeof(System.String))
                        throw new ArgumentException(resourceName + @" is an unexpected resource type.  (Are you setting resource FileType=Text?)");

                    response = ObjectToUTF8Stream(resource);
                    break;
            }

            return response;
        }

        //
        // convert object to stream
        private static object ObjectToUTF8Stream(object o) {
            MemoryStream stream = new MemoryStream();

            StreamWriter writer = new StreamWriter(stream, Encoding.UTF8);
            writer.Write(o);
            writer.Flush();
            stream.Position = 0;

            return stream;
        }

        //
        // default response is to call tbe base resolver
        private object defaultResponse(Uri absoluteUri, string role, Type ofObjectToReturn) {
            return base.GetEntity(absoluteUri, role, ofObjectToReturn);
        }

        //
        // determine whether this is an external request
        private static bool isExternalRequest(Uri absoluteUri, Type ofObjectToReturn) {
            return absoluteUri.Scheme == @"http" && (ofObjectToReturn == null || ofObjectToReturn == typeof(Stream));
        }

        //
        // translate uri to format compatible with reource manager key naming rules
        // see: System.Resources.Tools.StronglyTypedResourceBuilder.VerifyResourceName Method
        //   from http://msdn.microsoft.com/en-us/library/ms145952.aspx:
        private static string uriToResourceKey(Uri absoluteUri) {
            const string repl = @"[ \xA0\.\,\;\|\~\@\#\%\^\&\*\+\-\/\\\<\>\?\[\]\(\)\{\}\" + "\"" + @"\'\:\!]+";
            return Regex.Replace(Path.GetFileNameWithoutExtension(absoluteUri.LocalPath), repl, @"_");
        }
    }
}

وبفضل Tamberg، حفظت لي قدرا كبيرا من الوقت مع إجابتك موجزة وصحيحة. لم أكن أدرك أن محلل الافتراضية تذهب إلى شبكة الإنترنت. فحص MSDN هو يقول -

<اقتباس فقرة>   

XmlResolver هو محلل الافتراضية لكافة الفئات في مساحة الاسم System.Xml. يمكنك أيضا إنشاء محلل الخاصة بك ...

ولقد نفذت إجابتك، ووضع محلل إلى NULL الذي يحل المشكلة ويقلل من الشبكة العامة.

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

وشكرا مرة أخرى، أندي

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top