ASMX не генерирует WSDL при использовании Custom IHttpHandlerFactory - PullRequest
1 голос
/ 25 августа 2009

Я внедряю динамический веб-сервис ASMX через пользовательский HttpHandler, и мой веб-сервис недавно прекратил генерировать WSDL автоматически. Когда я использую? WSDL в URL-адресе asmx, я получаю следующую ошибку:

System.InvalidOperationException: XML Web service description was not found.
   at System.Web.Services.Protocols.DiscoveryServerProtocol.WriteReturns(Object[] returnValues, Stream outputStream)
   at System.Web.Services.Protocols.WebServiceHandler.WriteReturns(Object[] returnValues)
   at System.Web.Services.Protocols.WebServiceHandler.Invoke()

Некоторое время назад это работало нормально, поэтому мне интересно, есть ли где-нибудь проблема с правами доступа к файлу.

Поиск Google не возвращает никаких ссылок на эту конкретную ситуацию.

Я сомневаюсь, что мой код имеет отношение к проблеме; не изменилось:

[WebService(Description = "...", Namespace = "...")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
public class MyWebService : System.Web.Services.WebService
{
    [WebMethod]
    void MyWebMethod() {}
}

public class VirtualWebServiceFactory : IHttpHandlerFactory
{
    public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
    {
        WebServiceHandlerFactory wshf = new WebServiceHandlerFactory();
        MethodInfo coreGetHandler = wshf.GetType().GetMethod("CoreGetHandler", BindingFlags.NonPublic | BindingFlags.Instance);
        IHttpHandler handler = (IHttpHandler)coreGetHandler.Invoke(wshf, new object[] { typeof(MyWebService), context, context.Request, context.Response });    
        return handler;
    }
}

Декомпиляция System.Web.Services.Protocols.DiscoveryServerProtocol.WriteReturns () показывает, что она ищет описание службы XML в словаре, созданном где-то еще.

Я надеялся, что кто-то, знакомый с DiscoverServerProtocol и т. Д., Может знать, при каких обстоятельствах описание службы XML может не сработать.

Следующее работает просто отлично:

ServiceDescriptionReflector reflector = new ServiceDescriptionReflector();
reflector.Reflect(typeof(MyWebService), "...");

Переход на MyWebService.asmx показывает все функции и позволяет их тестировать. Но использование? WSDL дает исключение выше.

Ответы [ 2 ]

0 голосов
/ 16 августа 2010

Хм, спустя много месяцев, выяснилось, что URL переписывается, чтобы включить другие параметры, кроме? WSDL, что приводило к закрытию закрытой функции.

0 голосов
/ 30 августа 2009

Просто для удовольствия, попробуйте сделать вашу WebMethod публичной.

Однако реальный ответ - не облажаться с кодом .NET Framework, который не предназначен для вызова. Что не так просто позвонить GetHandler? Чего вы пытаетесь достичь здесь, чего нельзя достичь, не покопавшись во внутренностях неясного класса?

...