Как получить маршрутизацию ASP.NET WebForms для правильной маршрутизации JSON-вызовов .asmx? - PullRequest
3 голосов
/ 16 декабря 2011

Я пытаюсь реализовать многопользовательский режим в устаревшем приложении 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();
            }
        }
    }
}

Соответствующие ссылки:

Ответы [ 2 ]

1 голос
/ 10 февраля 2012

Проект с открытым исходным кодом http://www.teamlab.com построен с использованием ASP.NET Webforms и использует модель с несколькими арендаторами / saas.Я заметил, что вы разместили еще один вопрос о мультитенантности.

Возможно, вы можете заглянуть в их код для справочных идей.

0 голосов
/ 29 декабря 2012

Я старался изо всех сил, в итоге потерпел неудачу и вместо этого преобразовал все свои веб-службы в службы WCF .svc.

...