2009-09-01 20 views
5

Tengo un archivo .wsdl que debe implementar mi servicio web (antiguo estilo asmx). Eso está cuidado. Cuando publico el servicio web, puede llamarlo con el parámetro? Wsdl para obtener un wsdl generado.¿Cómo incluyo mi propio wsdl en mi servicio web en C#

¿Cómo incluyo mi archivo .wsdl para que sea el que se devuelve en lugar del archivo generado?

¿Es posible hacer con un atributo en mi clase de servicio web?

+0

¿Por qué necesita para hacer esto? ¿No son los dos equivalentes, si no idénticos? –

+0

El wsdl está hecho a mano por la persona que llama y el servicio que he creado no se ve exactamente igual. Quiero hacer esto para asegurarme de que estoy cumpliendo con la solicitud de los llamantes. Ahora están recibiendo un error "El servidor no reconoció el valor de SOAPAction del encabezado HTTP". Al depurar este error, me gustaría eliminar todas las fallas posibles de mi lado. –

+0

Aquí hay una publicación anterior de pluralsight que intentaré "Usar un archivo WSDL personalizado en ASP.NET Web Services": http: //www.pluralsight.com/community/blogs/craig/archive/2005/12/15/17482.aspx –

Respuesta

2

¿Es un hecho para quedarse con ASMX "viejo estilo"? ¿O podrías pasar a WCF? Esa es realmente la oferta de servicios web más reciente de Microsoft, y si estás haciendo algo nuevo y estás en .NET 3.0 o superior, ¿por qué dedicar tiempo a la tecnología "antigua"?

En WCF, definitivamente podría definir un archivo WSDL físico estático para ser utilizado por los clientes que se conectan a su punto final de metadatos (su "...? Wsdl" URL). No estoy seguro de si puede hacerlo en ASMX, también.

bien, en ASMX/.NET 2.0, se puede, por supuesto, siempre poner el archivo WSDL real bajo la raíz de su sitio web, y luego simplemente hacer referencia a ella como esto:

http://yourwebserver/YourVirtDir/MyService.wsdl 

no lo hago saber si hay una forma de "redirigir" el

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

llamada para ir a esa URL fija en su lugar. ¡Estoy seguro de que alguien más lo sabrá, sin embargo!

Marc

+0

Por ahora estoy atascado en .NET 2.0 y no puedo usar WCF. Pero sí creo que es posible trabajar con "contrato primero" incluso con asmx y señalar su solicitud de wsdl a un archivo separado. –

+0

No es posible señalar "? Wsdl" a un archivo separado. Solo sirva el archivo .wsdl en una URL separada como marc_s sugerida. –

-1

Usted puede generar un archivo WSDL y DISCO señalando la herramienta disco.exe que se incluye con .NET Framework en su servicio web.

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

Los siguientes ficheros:

results.discomap 
MyWebService.disco 
MyWebService.wsdl 
+0

No necesito generar un wsdl. La persona que llama ha definido el wsdl. He realizado una implementación de un servicio web ASP.NET (.asmx) y ahora me gustaría redirigir las referencias a? Wsdl a este archivo .wsdl provisto que obtuve. –

+0

A continuación, cambie el archivo disco para que apunte a su wsdl – bryanbcook

+0

-1: esto no funciona. –

2

Para evitar la confusión de tener dos WSDL diferentes disponibles en dos direcciones URL diferentes (es decir, el * asmx URL WSDL y una URL personalizada?) En su aplicación de servicio web, podría escribir un HttpModule que intercepte la solicitud a la URL * .asmx? wsdl y, en su lugar, devuelva su WSDL personalizado.

EDIT: He aquí un ejemplo, adaptada y simplificada de un código previamente escribí que hace un WSDL de encargo disponible en el estándar * asmx URL WSDL?.

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

Este código simplificado asume que su WSDL personalizada está en la misma carpeta que el archivo .asmx con una extensión .wsdl. El HttpModule necesita ser enganchado en su aplicación de servicio web a través del archivo web.config:

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

-1: la forma más simple de evitar la confusión es simplemente eliminar el protocolo 'Documentation' del elemento' protocols' en web.config. –

+0

Supongo que esto fue más adecuado para ser un comentario sobre la respuesta de marc_s que una respuesta en sí misma. Sin embargo, todavía hay valor en el protocolo de documentación y tener su WSDL en la única URL que los desarrolladores están familiarizados con ver como la URL WSDL para un servicio web .asmx. Esta es la razón por la que me aseguraría de que si quería que mi WSDL personalizado estuviera disponible en línea, usaría un HttpModule u otra tecnología de reescritura de URL para poner mi WSDL personalizado en la ubicación esperada. – GBegen

+0

Pareces estar suponiendo que eso funcionaría. Sugeriría que no hagas tales suposiciones. –

Cuestiones relacionadas