2008-11-27 19 views
6

He escrito un control compuesto ASP.NET que incluye algo de Javascript que se comunica con un servicio web.¿Cómo crear un servicio web sin un archivo ASMX?

He empaquetado las clases para el control y el servicio en un archivo DLL para que sea agradable y fácil para que las personas lo usen en otros proyectos.

El problema que tengo es que además de hacer referencia a la DLL en su proyecto, el consumidor de mi control también debe incluir un archivo .ASMX para el servicio web. Si bien no es un archivo complicado (solo una línea que se refiere a la clase en la DLL), me gustaría evitar tenerlo si puedo.

¿Hay alguna forma de evitar tener que tener el archivo .ASMX?

  • ¿Puedo registrar el servicio con el servidor web en Application_Start?
  • ¿Puedo hacer un cambio de web.config para hacer referencia a él de alguna manera?

¡Todas las sugerencias fueron recibidas con gratitud!

ACTUALIZACIÓN: El artículo vinculado a en la respuesta de John Sheehan (a continuación) funciona, pero no si desea llamar al servicio web utilizando AJAX. ¿Alguien sabe de una versión amigable AJAX?

+0

¿Puede decirnos cuál fue el problema con Ajax? – ryber

+0

Lo sentimos, no lo recuerdo ahora: o ( –

Respuesta

-8

La respuesta corta es no. El ASMX es el punto de entrada para cualquier servicio web. Hay alternativas si usa WCF, pero eso no es exactamente lo mismo.

+0

Lo siento, no le gustó la respuesta, pero ES la respuesta. – Chris

+2

Excepto por su no. Puede poner servicios web en una biblioteca de clase y conectarlos con la web. config. –

+0

Excepto que sí. Dije que la * respuesta * abreviada es no. Y no puedes alojar un servicio web regular sin el archivo .asmx. El artículo al que enlazas seguramente describe una solución alternativa, pero no es estándar, y una solución muy detallada (como en, no corta) – Chris

5

Pruebe algo como esto. No sé si funcionará bien. Obtuve esta idea de ELMAH, que crea un controlador para una página que no existe físicamente y luego la sirve desde el ensamblado.

<configuration> 
    <system.web> 
     <httpHandlers> 
     <add verb="*" path="*WebService.asmx" type="MyHandler.WebServiceHandler, MyHandler" /> 
     </httpHandlers> 
    </system.web> 
</configuration> 

EDIT: yo estaba cerca, ver este artículo (en VB sin embargo): http://www.codeproject.com/KB/aspnet/wsinaclasslibrary.aspx

+0

Perfecto, estado buscando esto por un largo tiempo – ryber

0

considerar probar métodos de página (see this blog post). Todo lo que tienes que hacer es agregar el atributo de método web a un método estático en el código aspx detrás. Luego acceda al objeto PageMethod desde su código del lado del cliente (javascript). No se necesitan archivos ASMX. Espero que esto ayude.

3

Sé que esto es muy vieja pregunta, pero no ha sido contestada correctamente, así que aquí está:

Cada * asmx solicitud es por defecto manejado por System.Web.Services.Protocols.WebServiceHandlerFactory.

Al buscar en el código fuente de esta clase en el reflector .NET, es posible tener un servicio web sin archivo ASMX pero tendrá que llamar al método interno CoreGetHandler a través de la reflexión.

El siguiente método tomará su servicio web y devolverá su IHttpHandler.

public IHttpHandler GetHttpHandlerForWebService(WebService webService, HttpContext context) 
{ 
    var webServiceType = webService.GetType(); 
    var wshf = new System.Web.Services.Protocols.WebServiceHandlerFactory(); 
    var coreGetHandler = wshf.GetType().GetMethod("CoreGetHandler"); 
    var httpHandler = (IHttpHandler)coreGetHandler.Invoke(wshf, new object[] { webServiceType, context, context.Request, context.Response }); 
    return httpHandler; 
} 

vez que tenga su HttpHandler, es sólo cuestión de llamar

httpHandler.ProcessRequest (contexto)

Hecho. Sin ASMX y sin entradas web.config.

+0

¿Puede explicarnos a dónde iría este código? Su código de cliente debe tener una URL accesible. Si no hay marcador de posición ASMX o httpHandler definido en web.config, ¿cuál es la URL de punto de entrada? –

+1

Este método (que especifica un httpHandler en web.config) funciona bien en su mayor parte, pero el atributo '[System.Web.Script.Services.ScriptService]' parece ignorado. JSON enviado al servidor arroja una excepción (formato no válido) y 'MyService.asmx/js' o' MyService.asmx/jsdebug' devuelven un error de autenticación 500 (en IE) o error de autenticación 401. Con un marcador de posición .asmx, estos problemas desaparecen. –

+0

@nelson, si tiene IIS en modo integrado, todas las solicitudes http pasan por el motor ASP.NET (incluso sin los archivos de marcador de posición web.config o asmx). así que, básicamente, lo que necesita hacer es anular uno de los métodos del ciclo de vida de asp.net, como 'Init' e inyectar su httpHandler llamando a' httpHandler.ProcessRequest (context) '. Obviamente, tendrá que tener la variable 'httpHandler' ya establecida. es por eso que proporcioné un método que convertirá su clase de servicio web en 'IHttpHandler' genérico. –

Cuestiones relacionadas