2009-09-01 12 views
5

Web servisimin (eski asmx stili) gerçekleştirmesi gereken bir .wsdl dosyası var. Bu halledilir. Web servisini yayınladığımda, oluşturulan bir wsdl dosyasını almak için? Wsdl parametresi ile çağırabilirsiniz.Web servisime kendi wsdl'yi nasıl dahil edebilirim? C#

.wsdl dosyamı nasıl eklenir, böylece oluşturulan yerine döndürülen dosya olur?

Web hizmet sınıfımda bir öznitelik ile yapmak mümkün mü?

+0

Bunu neden yapmanız gerekiyor? Aynı değilse, iki eşdeğer değil mi? –

+0

wsdl, arayan tarafından yapılmış ve yaptığım hizmet tam olarak aynı görünmüyor. Ben arayanların isteğini yerine getirdiğinden emin olmak için bunu yapmam. Artık "Sunucu, HTTP Üstbilgisi SOAPAction değerini tanımıyor" hatası alıyorlar. Bu hatayı ayıklarken, olası her hatayı tarafımdan kaldırmak istiyorum. –

+0

İşte çoğul bir eski gönderiden "ASP.NET Web Hizmetlerinde Özel bir WSDL Dosyası Kullanma" deneyeceğim: http: //www.pluralsight.com/community/blogs/craig/archive/2005/12/15/17482.aspx –

cevap

2

"Eski stil" ASMX ile kalmak için verilmiş mi? Yoksa WCF'ye gidebilir misin? Bu gerçekten Microsoft tarafından sunulan en güncel web servisidir ve eğer yeni bir şey yapıyorsanız ve .NET 3.0 veya üzerindeyseniz - neden "eski" teknolojiye zaman harcıyorsunuz?

WCF'de, meta veri bitiş noktanıza ("...? Wsdl" URL'nize) bağlanan istemciler tarafından kullanılmak üzere statik bir fiziksel WSDL dosyası tanımlayabilirsiniz. ASMX'te de yapabileceğinizden emin değilsiniz.

Tamam, ASMX üzerinde/.NET 2.0, tabii ki her zaman web sitesinin kökü altında gerçek WSDL dosyasını koyabilirsiniz ve sonra bunun gibi ona başvuru:

http://yourwebserver/YourVirtDir/MyService.wsdl 

Bilmiyorum bunun yerine sabit URL'ye gitmek için

http://yourwebserver/YourVirtDir/MyService.asmx?wsdl 

çağrıyı "yönlendirme" için bir yol olup olmadığını bilmek. Eminim başka birinin bileceklerinden eminim!

Marc

+0

Şimdilik .NET 2.0 üzerinde takılıyorum ve WCF kullanamazsınız. Ama ben asmx ile bile "ilk sözleşme" ile çalışmak ve? Wsdl isteğinizi ayrı bir dosyaya yönlendirmek mümkün olduğunu düşünüyorum. –

+0

"? Wsdl" işaretini ayrı bir dosyaya işaret etmek mümkün değil. Yalnızca .wsdl dosyasını önerilen marc_s gibi ayrı bir URL'de sunun. –

-1

Sen Disco.exe aracını işaret ederek WSDL ve DISCO dosyası oluşturmak anlamına web hizmetinizde .NET Framework ile gemi.

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

Aşağıdaki dosyalar oluşturulur:

results.discomap 
MyWebService.disco 
MyWebService.wsdl 
+0

Bir wsdl oluşturmama gerek yok. Arayan wsdl tanımlamıştır. Bir ASP.NET Web Hizmeti'nin (.asmx) bir uyarlamasını yaptım ve şimdi var olan bu .wsdl dosyasına başvuruları? Wsdl'ye yönlendirmek istiyorum. –

+0

Daha sonra, wsdl – bryanbcook

+0

-1 ürününüze işaret etmek için diski değiştirin: bu çalışmaz. –

2

iki farklı URL geçerli iki farklı WSDLs sahip karışıklığı önlemek için (yani * .Asmx wsdl URL ve özel bir URL?) Içinde Web servis uygulamasında, isteğinizi * .asmx? wsdl URL'sine engelleyen ve yerine özel WSDL değerini döndüren bir HttpModule yazabilirsiniz.

DÜZENLEME:? İşte adapte ve daha önce standart * .Asmx wsdl URL'de özel bir WSDL kullanılabilir hale getirir yazdığı bazı koddan basitleştirilmiş bir örnek.

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

Bu basitleştirilmiş kod özel WSDL bir .wsdl uzantısıyla .Asmx dosyası ile aynı klasörde olduğunu varsayar. HttpModule'in web hizmeti uygulamasına web.config dosyası üzerinden bağlanması gerekir:

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

-1: Karmaşıklıktan kurtulmanın daha basit yolu, web.config'deki 'Protocols 'öğesinden' Documentation' protokolünü kaldırmaktır. –

+0

Sanırım bu, marc_s'ın cevabı üzerine kendi başına bir cevaptan daha iyi bir yorum yapmak için daha uygun. Ancak, dokümantasyon protokolünde hala bir değer var ve WSDL'nizi geliştiricilerin bir .asmx web hizmeti için WSDL URL'si olarak görmeye alışkın oldukları bir URL'de bulundurun. Bu nedenle, özel WSDL'mizi çevrimiçi olarak kullanılabilir hale getirmek istesem, özel WSDL'imi beklenen konuma yerleştirmek için bir HttpModule veya başka bir URL yeniden yazma teknolojisini kullanacağımı garanti ederim. – GBegen

+0

Bunun işe yarayacağını varsayıyor gibisiniz. Bu gibi varsayımlarda bulunmamanızı öneririm. –

İlgili konular