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>
Dlaczego musisz to zrobić? Czy nie są dwa równoważne, jeśli nie identyczne? –
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. –
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 –