2009-09-01 19 views
5

Mam plik .wsdl, który musi zostać zaimplementowany przez moją usługę WWW (stary styl ASMX). To się załatwia. Kiedy publikuję usługę WWW, możesz wywołać ją z parametrem? Wsdl, aby uzyskać wygenerowany plik wsdl.Jak dołączyć mój własny plik wsdl do usługi WWW w języku C#

Jak dołączyć mój plik .wsdl, aby został zwrócony zamiast wygenerowanego?

Czy można to zrobić za pomocą atrybutu w mojej klasie usług internetowych?

+0

Dlaczego musisz to zrobić? Czy nie są dwa równoważne, jeśli nie identyczne? –

+0

Skrzynka wsdl jest wykonywana ręcznie przez dzwoniącego, a usługa, którą zbudowałem, nie wygląda dokładnie tak samo. Nie powinienem tego robić, aby mieć pewność, że spełniam prośbę dzwoniącego. Otrzymują teraz komunikat "Serwer nie rozpoznał wartości SOAP nagłówka HTTP". Podczas debugowania tego błędu chciałbym usunąć każdą możliwą usterkę po mojej stronie. –

+0

Oto stary post z pluralsight, który wypróbuję "Korzystanie z niestandardowego pliku WSDL w ASP.NET Web Services": http: //www.pluralsight.com/community/blogs/craig/archive/2005/12/15/17482.aspx –

Odpowiedz

2

Czy można pozostać przy "starym stylu" ASMX? Czy możesz przejść do WCF? To naprawdę najnowocześniejsza usługa oferowana przez Microsoft, a jeśli robisz coś nowego i korzystasz z .NET 3.0 lub nowszego - po co tracić czas na "starą" technologię?

W WCF zdecydowanie można zdefiniować statyczny plik WSDL, który będzie używany przez klientów łączących się z punktem końcowym metadanych (adres URL "...? Wsdl"). Nie jestem pewien, czy możesz to zrobić również w ASMX.

OK, na ASMX/.NET 2.0, można oczywiście zawsze umieścić rzeczywisty plik WSDL pod korzenia swojej stronie internetowej, a potem po prostu odwoływać się do niej tak:

http://yourwebserver/YourVirtDir/MyService.wsdl 

nie wiem wiedzieć, czy istnieje sposób, aby "przekierować" wywołanie, aby zamiast tego zadzwonić pod ten stały adres URL. Jestem pewien, że ktoś inny się dowie!

Marc

+0

Na razie utknąłem na .NET 2.0 i nie mogę używać WCF. Ale myślę, że można pracować z "pierwszym kontraktem" nawet z asmx i skierować swoje żądanie? Wsdl do osobnego pliku. –

+0

Nie można wskazać "? Wsdl" w osobnym pliku. Po prostu podaj plik .wsdl pod osobnym adresem URL, na przykład marc_s. –

-1

można wygenerować plik WSDL i DISCO kierując disco.exe narzędzie, że statki z .NET Framework w usłudze internetowej.

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

Poniższe pliki tworzone są:

results.discomap 
MyWebService.disco 
MyWebService.wsdl 
+0

Nie trzeba generować pliku wsdl. Osoba wywołująca zdefiniowała klucz wsdl. Wykonałem implementację usługi ASP.NET Web Service (.asmx), a teraz chciałbym przekierować odniesienia do pliku? Wsdl do podanego pliku .wsdl, który otrzymałem. –

+0

Następnie zmień plik disco tak, aby wskazywał na wsdl – bryanbcook

+0

-1: to nie działa. –

2

Aby uniknąć nieporozumień posiadania dwóch różnych WSDLs dostępne na dwóch różnych adresów URL (czyli * .asmx WSDL URL i niestandardowy URL?) W Twoja aplikacja usługi sieci Web, możesz napisać moduł HttpModule, który przechwytuje żądanie pod adres URL * .asmx? wsdl i zamiast tego zwraca niestandardowy plik WSDL.

EDIT: Oto przykład, dostosowane i uproszczone od jakiegoś kodu I wcześniej napisał, że sprawia, że ​​zwyczaj WSDL dostępne w standardzie * .asmx wsdl URL?.

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

Ten uproszczony kod zakłada, że ​​zwyczaj WSDL jest w tym samym folderze co plik .asmx z .wsdl przedłużenia. HttpModule należy podłączyć do aplikacji usług sieciowych za pomocą pliku web.config:

<?xml version="1.0"?> 
<configuration> 
    <!-- ... --> 
    <system.web> 
    <!-- ... --> 
    <httpModules> 
    <add 
    type="DemoWebService.CustomWsdlModule" 
    name="CustomWsdlModule"/> 
    <!-- ... --> 
    </httpModules> 
    <!-- ... --> 
    </system.web> 
    <!-- ... --> 
</configuration> 
+1

-1: Prostszym sposobem uniknięcia zamieszania jest po prostu usunięcie protokołu 'Documentation' z elementu' protocols' w pliku web.config. –

+0

Przypuszczam, że lepiej pasowało to do komentarza dotyczącego odpowiedzi marc'a niż samej odpowiedzi. Jednak protokół z dokumentacją wciąż zawiera wartość i ma swój WSDL pod jednym adresem URL, który programiści znają jako adres URL WSDL dla usługi internetowej .asmx. Dlatego chciałbym się upewnić, że jeśli chciałbym, aby mój niestandardowy WSDL był dostępny online, użyłbym HttpModule lub innej technologii przepisywania adresów URL, aby umieścić mój niestandardowy WSDL w oczekiwanej lokalizacji. – GBegen

+0

Wydaje się, że zakładasz, że to zadziała. Sugerowałbym, żebyś nie robił takich założeń. –

Powiązane problemy