2009-09-01 2 views
5
ein

Ich habe eine WSDL-Datei, die mein Web-Service (alte ASMX-Stil) implementieren muss. Dafür ist gesorgt. Wenn ich den Web-Service veröffentliche, können Sie ihn mit dem Parameter wsdl aufrufen, um eine generierte WSDL zu erhalten.Wie schließe ich meine eigene WSDL in meinem Web-Service in C#

Wie kann ich meine .wsdl-Datei einbeziehen, sodass diese anstelle des generierten zurückgegeben wird?

Ist es möglich, mit einem Attribut in meiner Web-Service-Klasse zu tun?

+0

Warum müssen Sie dies tun? Sind die beiden nicht gleichwertig, wenn nicht identisch? –

+0

Die WSDL wird vom Anrufer selbst gemacht und der Service, den ich aufgebaut habe, sieht nicht genau gleich aus. Ich möchte dies tun, um sicher zu gehen, dass ich die Anfrage des Anrufers erfülle. Jetzt erhalten sie einen Fehler "Server hat den Wert von HTTP Header SOAPAction nicht erkannt". Beim Debuggen dieses Fehlers möchte ich jeden möglichen Fehler auf meiner Seite entfernen. –

+0

Hier ist ein alter Beitrag von pluralight, den ich "Verwendung einer benutzerdefinierten WSDL-Datei in ASP.NET Web Services" ausprobieren werde: http: //www.pluralsight.com/community/blogs/craig/archive/2005/12/15/17482.aspx –

Antwort

2

Ist es eine Selbstverständlichkeit, bei "Old-Style" ASMX zu bleiben? Oder könnten Sie zu WCF wechseln? Das ist wirklich das aktuellste Webservice-Angebot von Microsoft, und wenn Sie etwas Neues machen und auf .NET 3.0 oder höher setzen - warum sollten Sie Zeit mit "alter" Technologie verbringen?

In WCF können Sie definitiv eine statische physische WSDL-Datei definieren, die von Clients verwendet wird, die eine Verbindung zu Ihrem Metadatenendpunkt herstellen (Ihre "...? Wsdl" -URL). Nicht sicher, ob Sie es auch in ASMX tun können.

OK, auf ASMX/.NET 2.0, könnten Sie natürlich immer setzen die tatsächliche WSDL-Datei unter der Wurzel Ihrer Website, und dann verweisen sie wie folgt aus:

http://yourwebserver/YourVirtDir/MyService.wsdl 

ich nicht wissen, ob es eine Möglichkeit gibt, den Anruf "umzuleiten", um stattdessen zu dieser festen URL zu gehen. Ich bin sicher, dass jemand anderes es wissen wird!

Marc

+0

Für jetzt bin ich auf .NET 2.0 fest und kann WCF nicht verwenden. Aber ich denke, dass es möglich ist, mit "contract first" sogar mit asmx zu arbeiten und Ihre "wsdl" -Anfrage auf eine separate Datei zu verweisen. –

+0

Es ist nicht möglich, "? Wsdl" auf eine separate Datei zu verweisen. Stellen Sie einfach die .wsdl-Datei unter einer separaten URL wie marc_s vorgeschlagen. –

-1

Sie können mit dem Hinweis das disco.exe Werkzeug, das mit dem .NET Framework auf Ihrem Web-Service eine WSDL und DISCO-Datei generieren.

disco.exe http://webserver/MyWebService.asmx 

Die folgenden Dateien erstellt:

results.discomap 
MyWebService.disco 
MyWebService.wsdl 
+0

Ich brauche keine WSDL zu generieren. Der Aufrufer hat die WSDL definiert. Ich habe eine Implementierung eines ASP.NET-Webdienstes (.asmx) durchgeführt und möchte nun die Verweise auf? Wsdl auf diese angegebene .wsdl-Datei umleiten, die ich erhalten habe. –

+0

Dann ändern Sie die Discodatei auf Ihren wsdl – bryanbcook

+0

-1: das funktioniert nicht. –

2

Um die Verwirrung der mit zwei verschiedenen WSDLs auf zwei verschiedene URLs zur Verfügung zu vermeiden (dh die * .asmx WSDL-URL und eine eigene URL?) In Mit Ihrer Webdienstanwendung können Sie ein HttpModule schreiben, das die Anfrage an die URL * .asmx? wsdl abfängt und stattdessen Ihre benutzerdefinierte WSDL zurückgibt.

EDIT: Hier ist ein Beispiel, angepasst und vereinfacht von einigen Code, den ich zuvor schrieb, die eine benutzerdefinierte WSDL bei der Standard * .asmx? Wsdl URL zur Verfügung stellt.

using System; 
using System.IO; 
using System.Web; 
using System.Web.Services.Configuration; 

namespace DemoWebService 
{ 
public class CustomWsdlModule : 
    IHttpModule 
{ 
    public void 
    Init(HttpApplication application) 
    { 
    // hook up to BeginRequest event on application object 
    application.BeginRequest += new EventHandler(this.onApplicationBeginRequest); 
    } 

    public void 
    Dispose() 
    { 
    } 

    private void 
    onApplicationBeginRequest(object source, EventArgs ea) 
    { 
    HttpApplication application = (HttpApplication)source; 
    HttpRequest request = application.Request; 
    HttpResponse response = application.Response; 

    // check if request is for WSDL file 
    if (request.Url.PathAndQuery.EndsWith(".asmx?wsdl", StringComparison.InvariantCultureIgnoreCase)) 
    { 
    // if Documentation protocol is not allowed, throw exception 
    if ((WebServicesSection.Current.EnabledProtocols & WebServiceProtocols.Documentation) == 0) 
    { 
    throw new System.InvalidOperationException("Request format is unrecognized."); 
    } 

    // get path to physical .asmx file 
    String asmxPath = request.MapPath(request.Url.AbsolutePath); 

    // build path to .wsdl file; should be same as .asmx file, but with .wsdl extension 
    String wsdlPath = Path.ChangeExtension(asmxPath, ".wsdl"); 

    // check if WSDL file exists 
    if (File.Exists(wsdlPath)) 
    { 
    // read WSDL file 
    using (StreamReader reader = new StreamReader(wsdlPath)) 
    { 
     string wsdlFileContents = reader.ReadToEnd(); 

     // write WSDL to response and end response without normal processing 
     response.ContentType = "text/xml"; 
     response.Write(wsdlFileContents); 
     response.End(); 
    } 
    } 
    } 
    } 
} 
} 

Dieser vereinfachte Code geht davon aus, dass Ihre benutzerdefinierte WSDL mit einer .wsdl Erweiterung im selben Ordner wie die ASMX-Datei ist. Das HttpModule muss über die Datei web.config mit Ihrer Web-Service-Anwendung verbunden sein:

+1

-1: Der einfachere Weg, die Verwirrung zu vermeiden, besteht einfach darin, das 'Documentation'-Protokoll aus dem 'protocols'-Element in web.config zu entfernen. –

+0

Ich nehme an, das war besser geeignet, ein Kommentar zu Marc's Antwort zu geben, als eine eigene Antwort. Es gibt jedoch immer noch einen Wert im Dokumentationsprotokoll und die Tatsache, dass Ihre WSDL unter der einen URL steht, die Entwickler als WSDL-URL für einen .asmx-Webdienst kennen. Aus diesem Grund würde ich sicherstellen, dass, wenn ich meine benutzerdefinierte WSDL online verfügbar machen möchte, ich eine HttpModule- oder andere URL-Umschreibetechnologie verwenden würde, um meine benutzerdefinierte WSDL an den erwarteten Speicherort zu bringen. – GBegen

+0

Sie scheinen davon auszugehen, dass das funktionieren würde. Ich würde vorschlagen, dass Sie solche Annahmen nicht machen. –

Verwandte Themen