ASP.NET MVCにおける宿主WCF Restサービスの問題点と解決方法

8524 ワード

久しぶりにブログを书きました.今日来てみたら、草が生えていて、扫除に来たようです.
最近ASPを研究しています.NET MVC 3とWCF Reset Serviceは、突然一緒に置いたらどうなるか見てみたい.ここまでやりたいならやる.次は私が書いたコードです.
public class MvcApplication : System.Web.HttpApplication
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }
 
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 
        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
 
    }
 
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        RegisterGlobalFilters(GlobalFilters.Filters);
         RouteTable.Routes.Add(new ServiceRoute("Uap", new WebServiceHostFactory(), typeof(Service.UapService)));
       RegisterRoutes(RouteTable.Routes);
    }
}
そして勢いよくF 5を押した.ええと、ホームページが思い通りに出てきました.サービスのUrlを入力しても、普通です.すべてが正常に見える.興奮中.勝手に接続をクリックしました.続いてカップが現れた.
http://localhost:3315/Uap?action=About&controller=Homeこれは...これは...これは何の住所ですか?どうして見たことがないの.囧啊.
……
…………
長いこと考えたが,いったい何が起こっているのか分からなかった.
コードをチェックしても問題が発生しません.
<ul id="menu"> 
    <li>@Html.ActionLink("Home""Index""Home")</li> 
    <li>@Html.ActionLink("Application""Index""Application")</li> 
    <li>@Html.ActionLink("About""About""Home")</li> 
</ul> 

これらのコードはWCF Rest Serviceに加入する前に正常に動作すると誓います.
どうやら
RouteTable.Routes.Add(new ServiceRoute("Uap", new WebServiceHostFactory(), typeof(Service.UapService)));
このコードは幽霊だ.
この行のコードを
RegisterRoutes(RouteTable.Routes);
次に、接続されたURLが正常になったのに、WCF Rest Serviceが機能しなくなったことに気づきました.本当におかしいですね.
思いもよらず、思い切ってMVCのソースコードをダウンロードした.
F 5にF 11を加えると、ようやく問題点が発見された.
従来のActionLinkメソッドではUrlを生成する際にすべてのRouteをポーリングし,条件に合ったRouteに指定されたパラメータのUrlを生成して最初の生成値を返すように要求したが,結果として卵痛のServiceRouteは頭が焼けたのかどうしたのかわからなかった.戻ってきた/Uap?Action=About&controller=Homeという悲しい住所.ActionLinkメソッドはそのままページに出力されます(だまされたかどうかは見ていませんが、バカな二番目の兄です).
問題の結末はもう見つかったようだ.今は何とかして解決しなければならない.
最も直接的な方法はMVCのソースコードを修正することですが、MVCプロジェクト全体のソースコードを見た後、私はこのクレイジーな考えを放棄しました.
しかし、一つの方法を発見しました.それは
RouteTable.Routes.Add(new ServiceRoute("Uap", new WebServiceHostFactory(), typeof(Service.UapService)));
すべてのMVCのRouteに置いた後、すべての接続のUrlは正常になりました.
しかしこれでWCF Rest ServiceのRouteアドレスは
routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }
遮断する.
頭が痛い・・・
MVCのRouteにServiceRouteのRouteアドレスを無視させる方法があるように見えます.どうすればいいですか.
無視?はい、無視します.
やると言えばやる.
routes.IgnoreRoute("/Uap/{*pathInfo}");
これでいいでしょう.
F 5を押すと、トップページは正常です.リンクUrl正常;Wcf Service?異常です.に頼る
よく見ると...
頭が痛くて足が痛くて、このIgnoreRouteとMVCはまったく関係がありません.
routes.IgnoreRoute("/Uap/{*pathInfo}");
いっそWcf Serviceを封じ込めた.
これではだめなのか、MVCのソースコードを本当に修正するのか.
私はそうしたくないから,これ以上研究してみよう.私は30分も滞在してもコードを1行も書きたくないので、手を出しても頭を働かすほど達成感がありません.△軽蔑されるべき怠け者は、30分も滞在するためにコードを1行少なく書くように工夫している.
退屈なことにMSDNをひっくり返すと、MapRouteメソッドにはルーティングルールを制約する正規表現を渡すことができる指定されたパラメータがあることを突然思い出した.
私はもう問題を解決する金の鍵を見つけたようだ.
次のコードを書きます.
 routes.MapRoute( 
     "Default"// Route name 
     "{controller}/{action}/{id}"// URL with parameters 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
     new { controller = @"^\b(?!uap)\w*\b$" } 

ルールは簡単で、すべてのパスにuap文字のパスがあることを無視します.
運行後、すべて正常で、やっと問題を解決したことに気づいた.
ソースコードを貼り付けます.
public class MvcApplication : System.Web.HttpApplication 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
        filters.Add(new HandleErrorAttribute()); 
    } 

 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

 
        routes.MapRoute( 
            "Default"// Route name 
            "{controller}/{action}/{id}"// URL with parameters 
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
            new { controller = @"^\b(?!uap)\w*\b$" } 
        ); 

 
    } 

 
    protected void Application_Start() 
    { 
        AreaRegistration.RegisterAllAreas(); 
        RegisterGlobalFilters(GlobalFilters.Filters); 
        RegisterRoutes(RouteTable.Routes); 
        RouteTable.Routes.Add(new ServiceRoute("Uap"new WebServiceHostFactory(), typeof(Service.UapService))); 
    } 
} 

 
仕事を終えて寝る.
ぼんやりしているうちに...急に目が覚めて、お風呂に入るのを忘れました!!!