2009-08-24 7 views
1

Ich implementiere einen dynamischen ASMX-Webdienst über einen benutzerdefinierten HttpHandler, und mein Webdienst hat kürzlich die automatische Generierung von WSDL beendet. ? Wenn ich WSDL auf dem asmx URL, bekomme ich folgende Fehlermeldung:ASMX erzeugt keine WSDL, wenn Custom IHttpHandlerFactory verwendet wird

System.InvalidOperationException: XML Web service description was not found. 
    at System.Web.Services.Protocols.DiscoveryServerProtocol.WriteReturns(Object[] returnValues, Stream outputStream) 
    at System.Web.Services.Protocols.WebServiceHandler.WriteReturns(Object[] returnValues) 
    at System.Web.Services.Protocols.WebServiceHandler.Invoke() 

Dies funktionierte gut vor einer Weile, so frage ich mich, ob es eine Datei Erlaubnis Problem ist irgendwo.

Eine Google-Suche gibt keinen Verweis auf diese bestimmte Situation zurück.

Ich bezweifle, dass mein Code für das Problem relevant ist; es hat sich nicht geändert:

[WebService(Description = "...", Namespace = "...")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[ToolboxItem(false)] 
public class MyWebService : System.Web.Services.WebService 
{ 
    [WebMethod] 
    void MyWebMethod() {} 
} 

public class VirtualWebServiceFactory : IHttpHandlerFactory 
{ 
    public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated) 
    { 
     WebServiceHandlerFactory wshf = new WebServiceHandlerFactory(); 
     MethodInfo coreGetHandler = wshf.GetType().GetMethod("CoreGetHandler", BindingFlags.NonPublic | BindingFlags.Instance); 
     IHttpHandler handler = (IHttpHandler)coreGetHandler.Invoke(wshf, new object[] { typeof(MyWebService), context, context.Request, context.Response });  
     return handler; 
    } 
} 

Decompiling System.Web.Services.Protocols.DiscoveryServerProtocol.WriteReturns() zeigt, dass es die XML-Service-Beschreibung in einem Wörterbuch woanders erstellt nachschlägt.

Ich hatte gehofft, dass jemand, der mit dem DiscoverServerProtocol usw. vertraut ist, vielleicht weiß, unter welchen Umständen die XML-Dienstbeschreibung nicht erstellt werden kann.

Folgende funktioniert gut:

ServiceDescriptionReflector reflector = new ServiceDescriptionReflector(); 
reflector.Reflect(typeof(MyWebService), "..."); 

zu MyWebService.asmx Navigation zeigt alle Funktionen, und sie testen ermöglicht. Aber die Verwendung von WSDL gibt die obige Ausnahme.

+0

Können wir einen Code sehen, oder sollen wir raten? Deine Entscheidung. –

+0

Ich habe Codebeispiele hinzugefügt. Ich bezweifle jedoch, dass sie das Problem beleuchten werden. Ich hoffe, dass jemand, der mit den Interna von System.Web.Services.Protocols.DiscoveryServiceProtocol vertraut ist, möglicherweise weiß, unter welchen Umständen die WSDL nicht erstellt werden kann. –

+0

Hallo, bist du mit dem hier gelandet? –

Antwort

0

Hmm, nach vielen Monaten, fand heraus, dass die URL neu geschrieben wurde, um andere Parameter als die WSDL einzuschließen, die die private Funktion erstickt.

0

Nur zum Spaß, versuchen Sie Ihre WebMethod Öffentlichkeit.

Die wirkliche Antwort ist jedoch, nicht mit .NET Framework-Code, der nicht aufgerufen werden soll. Was ist los mit GetHandler anrufen? Was versuchst du hier zu erreichen, das nicht erreicht werden kann, ohne im Inneren einer obskuren Klasse herumzuspielen?

+0

Beachten Sie den Unterschied in den Parametern von GetHandler() und CoreGetHandler(). CoreGetHandler() gibt einen Handler zurück, der die Standardseite bereitstellt, auf der die Webdienstmethoden und (bis vor kurzem) die WSDL aufgelistet sind. Die Aufgabe, die ich erreichen möchte, besteht darin, einen virtuellen Webdienst ohne eine physische .asmx-Datei bereitzustellen. –

+0

Auch hier würde ich nicht mit Legacy-Technologie (ASMX) herumspielen und erwarten, dass alles erledigt wird. Wechseln Sie zu WCF, das über eine echte Erweiterbarkeitsarchitektur verfügt, bei der Sie Reflection nicht zum Aufrufen undokumentierter interner Methoden verwenden müssen. –

+0

Leider arbeite ich an einer großen Legacy-Code-Basis, mit geringen Chancen, in absehbarer Zeit zu WCF zu wechseln. –

Verwandte Themen