使用Custom IHttpHandlerFactory时,ASMX不生成WSDL

时间:2009-08-24 21:05:18

标签: asp.net asmx

我正在通过自定义HttpHandler实现动态ASMX Web服务,我的Web服务最近自动停止生成WSDL。当我在asmx url上使用?WSDL时,我收到以下错误:

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 :(得分:0)

只是为了好玩,试着让你的WebMethod公开。

但是,真正的答案是不要使用不打算调用的.NET Framework代码。只是致电GetHandler有什么问题?你想在这里完成什么,如果不在一个晦涩的班级内部搞乱,就无法实现?

答案 1 :(得分:0)

嗯,经过几个月,发现URL正在被重写,以包含除WSDL之外的其他参数,这使得私有函数窒息。