Quando il metodo ResolveUri
riceve una richiesta per un modulo di "pubblico" della URI come -//W3C//ELEMENTS XHTML Images 1.0//EN
poi fa il tuo metodo di tiro e attendere il successivo URI web-like, che inizia con http://
?
invece di buttare, risolvo il pubblico URI al corrispondente http://
URI (e poi nel mio metodo GetEntity
ho intercettare le richieste al http://
URI).
Non ho quindi mai da buttare, che credo sia la soluzione giusta.
That's a smart way to do it. How big is your dictionary? The library I pointed you to handles only XHTML 1.0, and there is just one public URI base that would need to be mapped.
sto usando XHTML 1.1, che è 'modulare' quindi devo mappare circa 40 file.
Attenzione che il comportamento del framework potrebbe essere cambiato! Ho una libreria (inclusa la mia classe XhtmlUrlResolver) che è costruita con .NET Framework 2, ma è invocata in modo diverso a seconda che l'applicazione (che utilizza la libreria) sia compilata per .NET 2 o .NET 4.
con .NET 2, quando il mio metodo ResolveUri sempre solo delegata in modo trasparente ad un XmlUrlResolver, allora sarebbe:
- Chiedere al ResolveUri pubblico del DTD.
- Prova a GetEntity DTD dal disco (tiri uno DirectoryNotFoundException)
- Provate a GetEntity DTD da http (che mi piacerebbe servire da risorse locali)
- Prova a GetEntity tutti gli altri file da http (che ho' d servire da risorse locali)
Con .NET 4 ci fu una chiamata in più per ogni risorsa:
- Chiedere di ResolveUri pubblico del sub-risorsa (ad esempio il file
*.mod
), WHI ch mia implementazione solo delegato a XmlUrlResolver
- Chiedere di GetEntity pubblico 'risolto' del sub-risorsa, che non è stato realmente risolto affatto, appena avuto un prefisso http simile aggiunto (tiri WebException)
Lanciare tutte quelle WebException rallentando l'elaborazione molto, motivo per cui l'ho rivisitato per cercare una soluzione.
Il tuo suggerimento, che butto da ResolveUri, ha risolto quel problema, per il quale ti ringrazio; ma invece di lanciare, restituire qualcosa da ResolveUri è più elegante (e un po 'più veloce: 40 meno eccezioni).
Ecco il mio codice sorgente corrente.
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.IO;
using System.Xml;
//don't obfuscate the file names of the embedded resources,
//which are contained in a "Files" subfolder of the project
[assembly: Obfuscation(Feature = "Apply to ModelText.ModelXml.Files.*: all", Exclude = true, ApplyToMembers = true)]
namespace ModelText.ModelXml
{
/// <summary>
/// This class provides local (i.e. faster) access to the XHTML DTD.
/// </summary>
/// <remarks>
/// Another way to implement this class is described in MSDN "Customizing the XmlUrlResolver Class"
/// which shows as an example a "class XmlCachingResolver"
/// and which is implemented using WebRequest and HttpRequestCachePolicy
/// </remarks>
[System.Reflection.ObfuscationAttribute(Feature = "renaming", ApplyToMembers = true)]
public class XhtmlUrlResolver : XmlResolver
{
XmlUrlResolver m_xmlUrlResolver = new XmlUrlResolver();
Assembly m_assembly = Assembly.GetExecutingAssembly();
public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
{
string uriString = absoluteUri.ToString();
if (s_resources.uriExists(uriString))
{
//Console.WriteLine("XhtmlUrlResolver Found {0} -- {1}", uriString, DateTime.Now);
//to get the filename of the embedded resource, remove the http: directory
//this is OK because the filenames are unique and map 1-to-1 with resource names
string filename = uriString.Substring(uriString.LastIndexOf('/') + 1);
Stream stream = m_assembly.GetManifestResourceStream(typeof(XhtmlUrlResolver), "Files." + filename);
return stream;
}
//Console.WriteLine("XhtmlUrlResolver Throwing {0} -- {1}", uriString, DateTime.Now);
throw new ArgumentException();
//Console.WriteLine("XhtmlUrlResolver Getting {0} -- {1}", uriString, DateTime.Now);
//object o = m_xmlUrlResolver.GetEntity(absoluteUri, role, ofObjectToReturn);
//Console.WriteLine("XhtmlUrlResolver Got {0} -- {1}", uriString, DateTime.Now);
//return o;
}
public override Uri ResolveUri(Uri baseUri, string relativeUri)
{
string resolved = s_resources.resolve(relativeUri);
if (resolved != null)
{
//Console.WriteLine("ResolveUri resolving {0}, {1} -- {2}", baseUri, relativeUri, DateTime.Now);
return new Uri(resolved);
}
//Console.WriteLine("ResolveUri passing {0}, {1} -- {2}", baseUri, relativeUri, DateTime.Now);
return m_xmlUrlResolver.ResolveUri(baseUri, relativeUri);
}
public override System.Net.ICredentials Credentials
{
set { m_xmlUrlResolver.Credentials = value; }
}
static Resources s_resources = new Resources();
class Resources
{
Dictionary<string, string> m_publicToUri = new Dictionary<string, string>();
internal Resources()
{
for (int i = 0, n = array.GetLength(0); i < n; ++i)
{
m_publicToUri.Add(array[i, 1], array[i, 0]);
}
}
internal bool uriExists(string absoluteUri)
{
return m_publicToUri.ContainsValue(absoluteUri);
}
internal string resolve(string relativeUri)
{
string resolved;
if (m_publicToUri.TryGetValue(relativeUri, out resolved))
{
return resolved;
}
return null;
}
static string[,] array = {
{ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd", "-//W3C//DTD XHTML 1.1//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml11-model-1.mod", "-//W3C//ENTITIES XHTML 1.1 Document Model 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-attribs-1.mod", "-//W3C//ENTITIES XHTML Common Attributes 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-base-1.mod", "-//W3C//ELEMENTS XHTML Base Element 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-bdo-1.mod", "-//W3C//ELEMENTS XHTML BIDI Override Element 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-blkphras-1.mod", "-//W3C//ELEMENTS XHTML Block Phrasal 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-blkpres-1.mod", "-//W3C//ELEMENTS XHTML Block Presentation 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-blkstruct-1.mod", "-//W3C//ELEMENTS XHTML Block Structural 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-charent-1.mod", "-//W3C//ENTITIES XHTML Character Entities 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-csismap-1.mod", "-//W3C//ELEMENTS XHTML Client-side Image Maps 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-datatypes-1.mod", "-//W3C//ENTITIES XHTML Datatypes 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-edit-1.mod", "-//W3C//ELEMENTS XHTML Editing Elements 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-events-1.mod", "-//W3C//ENTITIES XHTML Intrinsic Events 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-form-1.mod", "-//W3C//ELEMENTS XHTML Forms 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-framework-1.mod", "-//W3C//ENTITIES XHTML Modular Framework 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-hypertext-1.mod", "-//W3C//ELEMENTS XHTML Hypertext 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-image-1.mod", "-//W3C//ELEMENTS XHTML Images 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-inlphras-1.mod", "-//W3C//ELEMENTS XHTML Inline Phrasal 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-inlpres-1.mod", "-//W3C//ELEMENTS XHTML Inline Presentation 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-inlstruct-1.mod", "-//W3C//ELEMENTS XHTML Inline Structural 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-inlstyle-1.mod", "-//W3C//ELEMENTS XHTML Inline Style 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-lat1.ent", "-//W3C//ENTITIES Latin 1 for XHTML//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-link-1.mod", "-//W3C//ELEMENTS XHTML Link Element 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-list-1.mod", "-//W3C//ELEMENTS XHTML Lists 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-meta-1.mod", "-//W3C//ELEMENTS XHTML Metainformation 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-object-1.mod", "-//W3C//ELEMENTS XHTML Embedded Object 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-param-1.mod", "-//W3C//ELEMENTS XHTML Param Element 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-pres-1.mod", "-//W3C//ELEMENTS XHTML Presentation 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-qname-1.mod", "-//W3C//ENTITIES XHTML Qualified Names 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-script-1.mod", "-//W3C//ELEMENTS XHTML Scripting 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-special.ent", "-//W3C//ENTITIES Special for XHTML//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-ssismap-1.mod", "-//W3C//ELEMENTS XHTML Server-side Image Maps 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-struct-1.mod", "-//W3C//ELEMENTS XHTML Document Structure 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-style-1.mod", "-//W3C//ELEMENTS XHTML Style Sheets 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-symbol.ent", "-//W3C//ENTITIES Symbols for XHTML//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-table-1.mod", "-//W3C//ELEMENTS XHTML Tables 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-target-1.mod", "-//W3C//ELEMENTS XHTML Target 1.0//EN" },
{ "http://www.w3.org/MarkUp/DTD/xhtml-text-1.mod", "-//W3C//ELEMENTS XHTML Text 1.0//EN" },
{ "http://www.w3.org/TR/ruby/xhtml-ruby-1.mod", "-//W3C//ELEMENTS XHTML Ruby 1.0//EN" }
};
}
}
}
+1 Grazie per aver postato questo. – ChrisW