2011-12-15 23 views
3

従来のASP.NET WebFormsアプリケーションでマルチテナントを実装しようとしています。.asmx JSON呼び出しをルーティングするためのASP.NET WebFormsルーティングを取得するにはどうすればよいですか?

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ことになっているが、何らかの理由でそれが働いていません。私はcontent-typeを設定しています - ルーティングせずにこの同じ正確なリクエストを送信するとうまくいきます。

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(); 
      } 
     } 
    } 
} 

関連リンク:

+0

コメントアウトされたコードは正しく表示されますが、エラーが発生しますか? –

+0

私のコードを微調整し、エラーmsgを追加しました... –

答えて

0

私はベストを尽くして失敗し、すべてのWebサービスをWCF .svcサービスに変換しました。

1

http://www.teamlab.comプロジェクトは、ASP.NET Webフォームで構築され、そしてマルチテナント/ SaaSモデルを使用しているオープンソース。あなたがマルチテナント性について質問する別の質問を投稿したことに気付きました。

おそらく、参照用のコードについては、そのコードを参照してください。

関連する問題