- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
其他人已经问过类似的问题:Validate an Xml file against a DTD with a proxy. C# 2.0
这是我的问题:我们有一个网站应用程序需要使用内部和外部资源。
有没有办法在不使用 system.net.defaultproxy 的情况下通过代理通过 dtd 进行验证?如果我们使用 defaultproxy,内部 web 服务会被破坏,但 dtd 验证有效。#
这是我现在正在做的验证 xml 的操作:
public static XDocument ValidateXmlUsingDtd(string xml)
{
var xrSettings = new XmlReaderSettings {
ValidationType = ValidationType.DTD,
ProhibitDtd = false
};
var sr = new StringReader(xml.Trim());
XmlReader xRead = XmlReader.Create(sr, xrSettings);
return XDocument.Load(xRead);
}
理想情况下,可以通过某种方式将代理分配给 XmlReader,就像您可以将代理分配给 HttpWebRequest 对象一样。或者也许有一种方法可以以编程方式打开或关闭 defaultproxy?这样我就可以在调用 Load the Xdocument 时打开它,然后再次关闭它?
仅供引用 - 我对如何解决这个问题持开放态度 - 请注意代理位于另一个域中,他们不想为我们的内部网络服务地址设置到我们的 dns 服务器的 dns 查找.
干杯,兰斯
最佳答案
是的,你可以解决这个问题。
一种选择是创建您自己的解析器来处理 DTD 解析。它可以使用任何它喜欢的机制,包括使用非默认代理进行出站通信。
var xmlReaderSettings = new XmlReaderSettings
{
ProhibitDtd = false,
ValidationType = ValidationType.DTD,
XmlResolver = new MyCustomDtdResolver()
};
在 MyCustomDtdResolver 的代码中,您需要指定所需的代理设置。它可能因 DTD 而异。
您没有指定,但如果您解析的 DTD 是固定不变的,那么 Silverlight 和 .NET 4.0 有一个不访问网络的内置解析器(没有代理,没有任何 http 通信)。它叫做XmlPreloadedResolver .开箱即用,它知道如何解析 RSS091 和 XHTML1.0。如果您有其他 DTD,包括您自己的自定义 DTD,并且它们是固定的或不变的,您可以将它们加载到此解析器中并在运行时使用它,并完全避免 HTTP 通信和代理复杂化。
如果您没有使用 .NET 4.0,那么您可以自己构建一个“无网络”解析器。为了避免 W3C traffic limit ,我 build 了a custom resolver myself, for XHTML ,也许您可以重复使用它。
另请参阅,a related link .
为了便于说明,这里是自定义 Uri 解析器中 ResolveUri 的代码。
/// <summary>
/// Resolves URIs.
/// </summary>
/// <remarks>
/// <para>
/// The only Uri's supported are those for W3C XHTML 1.0.
/// </para>
/// </remarks>
public override Uri ResolveUri(Uri baseUri, string relativeUri)
{
if (baseUri == null)
{
if (relativeUri.StartsWith("http://"))
{
Trace(" returning {0}", relativeUri);
return new Uri(relativeUri);
}
// throw if Uri scheme is unknown/unhandled
throw new ArgumentException();
}
if (relativeUri == null)
return baseUri;
// both are non-null
var uri = baseUri.AbsoluteUri;
foreach (var key in knownDtds.Keys)
{
// look up the URI in the table of known URIs
var dtdUriRoot = knownDtds[key];
if (uri.StartsWith(dtdUriRoot))
{
string newUri = uri.Substring(0,dtdUriRoot.Length) + relativeUri;
return new Uri(newUri);
}
}
// must throw if Uri is unknown/unhandled
throw new ArgumentException();
}
这是 GetEntity 的代码
/// <summary>
/// Gets the entity associated to the given Uri, role, and
/// Type.
/// </summary>
/// <remarks>
/// <para>
/// The only Type that is supported is the System.IO.Stream.
/// </para>
/// <para>
/// The only Uri's supported are those for W3C XHTML 1.0.
/// </para>
/// </remarks>
public override object GetEntity(Uri absoluteUri, string role, Type t)
{
// only handle streams
if (t != typeof(System.IO.Stream))
throw new ArgumentException();
if (absoluteUri == null)
throw new ArgumentException();
var uri = absoluteUri.AbsoluteUri;
foreach (var key in knownDtds.Keys)
{
if (uri.StartsWith(knownDtds[key]))
{
// Return the stream containing the requested DTD.
// This can be a FileStream, HttpResponseStream, MemoryStream,
// or whatever other stream you like. I used a Resource stream
// myself. If you retrieve the DTDs via HTTP, you could use your
// own IWebProxy here.
var resourceName = GetResourceName(key, uri.Substring(knownDtds[key].Length));
return GetStreamForNamedResource(resourceName);
}
}
throw new ArgumentException();
}
我的自定义解析器的完整工作代码 is available .
如果您的解析器执行网络通信,那么对于一般解决方案,您可能需要覆盖 Credentials 属性。
public override System.Net.ICredentials Credentials
{
set { ... }
}
另外,您可能想要公开一个 Proxy 属性。或不。正如我上面所说,您可能希望根据 DTD URI 自动确定要使用的代理。
关于c# - 如何通过代理使用 .dtd 而不是使用 system.net.defaultproxy 来验证 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2766357/
客户端无法使用我的 webpart,因为他在代理服务器后面,他们需要指定用户名和密码才能通过代理。我现在在我的配置文件中有这个: 有没有办法为此
我正在 WPF 中创建桌面应用程序。此应用程序使用 webclient 实例与 API 通信以从中收集数据。 在此桌面应用程序中,我想创建一个复选框,允许用户忽略 Internet 选项代理或使用默认
什么是 .Net Core appsettings.json 版本 ? 最佳答案 在 http://www.utilities-online.info/xmltojson 使用工具 我得
我正在尝试使用 HttpClient 与代理背后的 api 对话。但是因为代理只对当前环境有效,所以我不希望它被硬编码。 这是我目前正在做的: public static HttpClient Cre
我收到来自第三方应用程序 exe 的错误。该应用程序只是一个 exe,没有配置文件或其他文件。 “创建在‘system.net/defaultproxy’配置部分指定的网络代理时出错” 我该如何处理?
我在我们的直播平台上看到一个非常奇怪的问题,它包含四个 webserver Windows Server 2003 机箱位于 ISA 服务器后面的集群中 簇。他们都在运行 IIS 6。我们需要 web
其他人已经问过类似的问题:Validate an Xml file against a DTD with a proxy. C# 2.0 这是我的问题:我们有一个网站应用程序需要使用内部和外部资源。
情况是这样的,当我开始工作时(使用 ISA 服务器来connect) 我得到“无法解析远程服务器”所以我将这些行添加到 web.config 返回:
我试图在运行时读取我的默认代理设置的值,但我似乎无法找到这样做的任何方法。关于如何设置默认代理(例如 How to pass credentials in defaultProxy config se
我是一名优秀的程序员,十分优秀!