26

私はMVC2Webサイトと共存するWCFサービスを持っています。サービスのURLを次のようにしたいと思います。

http://localhost/projdir/Service

MVCサイトはまだ初期段階にあるため、ボイラープレートコントローラーなどはすべて残っています。

次のコードは、global.asaxで一見すると機能します。

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

    routes.Add(new ServiceRoute("Service", new ServiceHostFactory(), 
               typeof(MyService)));

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", 
              id = UrlParameter.Optional } // Parameter defaults
    );
}

このサービスは、私が説明した場所に表示され、宣伝どおりに機能します。素晴らしい。

ただし、この方法でコードを注文すると、すべてのコードが変更されることに気づきましたActionLink。たとえば、MVCサイトの[バージョン情報]タブは次のように表示されます。

http://localhost/projdir/Service?action=About&controller=Home

これは明らかに正しくありません(そうあるべきですhttp://localhost/projdir/Home/About/)。

ServiceRoute追加をデフォルトのMapRoute()呼び出しの下に移動すると、コントローラーが見つからないというエラーが発生します。(実際には、「StructureMapControllerFactoryはコントローラーのインスタンスを返しませんでした」というエラーが発生します。これは、StructureMapに接続しているためです。そもそも、コントローラーではありません。)

興味深いことに、それはの出力にのみ影響を与えているようですHtml.ActionLink()。手動で入力しhttp://localhost/projdir/Home/About/て正しいページに移動できます。

私が犯している恐ろしく明らかな初心者の間違いは何ですか?

4

3 に答える 3

19

MVC ルートのに Service ルートを移動してみてください。ただし、以前に発生した「missing controller」エラーを回避するには、Route Constraintを使用して MVC ルート追加します。これらのルート制約は正規表現にすることができます-基本的に、ルート制約を「サービス」ではない任意のコントローラーにする必要があります。「サービス」の要求が要求されると、それは失敗し、彼は WCF サービス ルートになります。

于 2010-08-26T03:41:04.637 に答える
9

私はそれで解決しました:

     routes.MapRoute(
             "Default", // Route name
             "{controller}/{action}/{id}", // URL with parameters
             new { controller = "Home", action = "Index", id = UrlParameter.Optional },
             new { controller = "^(?!api).*" }
        );
        routes.Add(new ServiceRoute("api", new DataServiceHostFactory(), typeof(dwService)));

私はこれがあなたにとって良いことを願っています

于 2012-06-03T00:05:43.283 に答える
3

別の解決策は、ServiceRouteを継承し、ここで説明されているようにGetVirtualPathメソッドをオーバーライドして返すことです。null

public class AppServiceRoute : ServiceRoute
{
    public AppServiceRoute(string routePrefix, ServiceHostFactoryBase serviceHostFactory, Type serviceType)
        : base(routePrefix, serviceHostFactory, serviceType)
    {
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        return null;
    }
}

このように、逆ルートマッピングでは、アクションに対してこのルートが選択されることはありません。チャームのように機能します

于 2011-06-29T07:30:08.387 に答える