ASP.NET WEB API 项目中的 ASMX 服务
ASMX service in a ASP.NET WEB API project
其中一个使用我们 Web API 站点的应用程序只能使用 ASMX Web 服务。我最近将带有 Web 服务的 Web API 项目部署到开发服务器,并尝试使用自动生成的网页测试 Web 服务。
我在 system.web
-> webService
-> protocols
web.config 部分启用了 HttpGet
和 HttpPost
以便使用自动生成用于测试的网页。当浏览到我要测试的方法时,URL 的格式如下:
https://mydomain.dev.com/MyApp/MyService.asmx?op=MyMethod
当我单击“调用”按钮时,我收到以下消息:
No such host is known
响应中的URL格式如下:
https://mydomain.dev.com/MyApp/MyService.asmx/MyMethod
如何配置路由以允许我在启用 HttpGet
和 HttpPost
协议的情况下使用自动生成的 ASMX 页面进行测试?
我不确定,但我认为您需要在 web.config 中为 Web 服务启用 HttpGet
和 HttpPost
协议。可以参考this documentation:
<system.web>
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
<system.web>
更新
您必须确保存在 httpHandler for asmx files 并且它不会被 Web 的 httpHandler 覆盖 api。然后确保该路由未被您的 webapi 路由器映射为类似 :
routes.IgnoreRoute("{resource}.asmx/{*pathInfo}");
See this question
为了使用 ASMX Web 服务自动测试工具,我必须创建一个自定义路由处理程序,它实现 IRouteHander
接口以将 HTTP POST 映射到适当的 Web 服务。自定义 IRouteHandler
将 return 为网络服务的正确 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")));
我的实现基于以下博客post:Creating a route for an .asmx Web Services with ASP.NET Routing
其中一个使用我们 Web API 站点的应用程序只能使用 ASMX Web 服务。我最近将带有 Web 服务的 Web API 项目部署到开发服务器,并尝试使用自动生成的网页测试 Web 服务。
我在 system.web
-> webService
-> protocols
web.config 部分启用了 HttpGet
和 HttpPost
以便使用自动生成用于测试的网页。当浏览到我要测试的方法时,URL 的格式如下:
https://mydomain.dev.com/MyApp/MyService.asmx?op=MyMethod
当我单击“调用”按钮时,我收到以下消息:
No such host is known
响应中的URL格式如下:
https://mydomain.dev.com/MyApp/MyService.asmx/MyMethod
如何配置路由以允许我在启用 HttpGet
和 HttpPost
协议的情况下使用自动生成的 ASMX 页面进行测试?
我不确定,但我认为您需要在 web.config 中为 Web 服务启用 HttpGet
和 HttpPost
协议。可以参考this documentation:
<system.web>
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
<system.web>
更新
您必须确保存在 httpHandler for asmx files 并且它不会被 Web 的 httpHandler 覆盖 api。然后确保该路由未被您的 webapi 路由器映射为类似 :
routes.IgnoreRoute("{resource}.asmx/{*pathInfo}");
See this question
为了使用 ASMX Web 服务自动测试工具,我必须创建一个自定义路由处理程序,它实现 IRouteHander
接口以将 HTTP POST 映射到适当的 Web 服务。自定义 IRouteHandler
将 return 为网络服务的正确 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")));
我的实现基于以下博客post:Creating a route for an .asmx Web Services with ASP.NET Routing