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これは...これは...これは何の住所ですか?どうして見たことがないの.囧啊.
……
…………
長いこと考えたが,いったい何が起こっているのか分からなかった.
コードをチェックしても問題が発生しません.
これらのコードは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メソッドにはルーティングルールを制約する正規表現を渡すことができる指定されたパラメータがあることを突然思い出した.
私はもう問題を解決する金の鍵を見つけたようだ.
次のコードを書きます.
ルールは簡単で、すべてのパスにuap文字のパスがあることを無視します.
運行後、すべて正常で、やっと問題を解決したことに気づいた.
ソースコードを貼り付けます.
仕事を終えて寝る.
ぼんやりしているうちに...急に目が覚めて、お風呂に入るのを忘れました!!!
最近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)));
}
}
仕事を終えて寝る.
ぼんやりしているうちに...急に目が覚めて、お風呂に入るのを忘れました!!!