ASP.NET WEB API项目中的ASMX服务

时间:2018-01-08 20:59:52

标签: c# web-services asp.net-web-api asp.net-mvc-routing asmx

使用我们的Web API站点的其中一个应用程序只能使用ASMX Web服务。我最近将带有Web服务的Web API项目部署到开发服务器,并尝试使用自动生成的Web页面测试Web服务。

我在HttpGet - >中启用了HttpPostsystem.web webService - > protocols web.config部分,以便使用自动生成的网页进行测试。浏览到我想测试的方法时,URL的格式如下:

https://mydomain.dev.com/MyApp/MyService.asmx?op=MyMethod

当我单击“调用”按钮时,收到以下消息:

  

没有这样的主人知道

回复中的网址采用以下格式:

https://mydomain.dev.com/MyApp/MyService.asmx/MyMethod

如何配置路由以允许我使用自动生成的ASMX页面进行测试并启用HttpGetHttpPost协议?

2 个答案:

答案 0 :(得分:0)

我不确定,但我认为您需要在web.config中为Web服务启用HttpGetHttpPost协议。您可以参考this documentation

  <system.web>
    <webServices>
      <protocols>
        <add name="HttpGet"/>
        <add name="HttpPost"/>
      </protocols>
    </webServices>
  <system.web>

<强>更新

您必须确保存在httpHandler for asmx files,并且不会被web api的httpHandler覆盖。然后确保您的webapi路由器没有映射路由,例如:

routes.IgnoreRoute("{resource}.asmx/{*pathInfo}");

See this question

答案 1 :(得分:0)

为了使用ASMX Web服务自动化测试工具,我必须创建一个自定义路由处理程序,它实现IRouteHander接口以将HTTP POST映射到适当的Web服务。自定义IRouteHandler将为Web服务返回正确的IHttpHandler

WebServiceRouteHandler路由处理程序

public class WebServiceRouteHandler : IRouteHandler
{
    private readonly string _virtualPath;
    private readonly WebServiceHandlerFactory _webServiceHandlerFactory = new WebServiceHandlerFactory();

    public WebServiceRouteHandler(string virtualPath)
    {
        if (virtualPath == null) throw new ArgumentNullException("virtualPath");

        if (!virtualPath.StartsWith("~/")) throw new ArgumentException("Virtual path must start with ~/", "virtualPath");

         _virtualPath = virtualPath;
    }

    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        //Note: can't pass requestContext.HttpContext as the first parameter because that's type HttpContextBase, while GetHandler wants HttpContext.
        return _webServiceHandlerFactory.GetHandler(HttpContext.Current, requestContext.HttpContext.Request.HttpMethod, _virtualPath, requestContext.HttpContext.Server.MapPath(_virtualPath));
     }
}

RouteConfig.cs中的RegisterRoutes方法

routes.Add("MyWebServiceRoute", new Route(
            "path/to/service/method",
            new RouteValueDictionary() { { "controller", null }, { "action", null } }, new WebServiceRouteHandler("~/MyWebService.asmx")));

我的实施基于以下博文:Creating a route for an .asmx Web Services with ASP.NET Routing