我如何得到ASP.. NET WebForms Routing正确路由.asmx JSON调用



我正在尝试在遗留ASP中实现多租户。. NET WebForms应用程序。我希望URL来指示适当的客户端,像这样:

http://example.com/client_name/Default.aspx
http://example.com/client_name/MyWebService.asmx

但是,我无法让它正确地路由.asmx。这个路由规则可以很好地接收所有传入的url:

routes.Add("ClientSelector", new System.Web.Routing.Route
(
   "{client}/{*path}",
   routeHandler: new ClientRoute()
));

但是我在处理。asmx调用时有问题。下面是我的IRouteHandler。我得到的错误是:

A first chance exception of type 'System.Web.Services.Protocols.SoapException' occurred in System.Web.Services.dll
Additional information: Unable to handle request without a valid action parameter. Please supply a valid soap action.

它应该是JSON,但由于某种原因它不工作。我正在设置内容类型-如果我发送相同的请求而没有路由,它会工作得很好。

public class ClientRoute : System.Web.Routing.IRouteHandler
{
    private string m_Path;
    private string m_Client;
    public ClientRoute() { }
    public bool IsReusable { get { return true; } }
    public IHttpHandler GetHttpHandler(System.Web.Routing.RequestContext requestContext)
    {
        this.m_Path = (string)requestContext.RouteData.Values["path"];
        this.m_Client = (string)requestContext.RouteData.Values["client"];
        string virtualPath = "~/" + this.m_Path;
        bool shouldValidate = false;
        if (shouldValidate && !UrlAuthorizationModule.CheckUrlAccessForPrincipal(
            virtualPath, requestContext.HttpContext.User,
                          requestContext.HttpContext.Request.HttpMethod))
        {
            requestContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
            requestContext.HttpContext.Response.End();
            return null;
        }
        else
        {
            HttpContext.Current.RewritePath(virtualPath);
            HttpContext.Current.Items.Add("Client", this.m_Client);
            if (virtualPath.EndsWith(".aspx"))
                return (IHttpHandler)BuildManager.CreateInstanceFromVirtualPath(virtualPath, typeof(Page));
            else
            {
                var asmxPos = virtualPath.IndexOf(".asmx", StringComparison.OrdinalIgnoreCase);
                if (asmxPos >= 0)
                {
                    // What goes here?  This isn't working...
                    var asmxOnlyVirtualPath = virtualPath.Substring(0, asmxPos + 5);
                    return new System.Web.Services.Protocols.WebServiceHandlerFactory().GetHandler(
                        HttpContext.Current, HttpContext.Current.Request.HttpMethod, asmxOnlyVirtualPath, HttpContext.Current.Server.MapPath(asmxOnlyVirtualPath));
                }
                else
                    return new StaticRoute();
            }
        }
    }
}

相关链接:

  • 获取ScriptHandlerFactory处理器

开源项目http://www.teamlab.com是用ASP构建的。NET Webforms,并使用多租户/saas模型。我注意到你发布了另一个关于多租户的问题。

也许你可以看看他们的代码来参考一下。

我尽了最大的努力,但以失败告终,我将所有的web服务转换为WCF .svc服务。

相关内容

  • 没有找到相关文章

最新更新