C#通过url调用Web服务

时间:2010-11-02 06:50:53

标签: c# asp.net-mvc wcf web-services routing

我正在开发一个webapplication,我想通过它的url调用web服务。我怎样才能做到这一点?

我在global.asax中注册了以下路线;

routes.MapRoute(
                "ServiceHandler",
                "{*path}/{*.svc}",
                new { Url = "Services/Service.svc/GetLatestTweets" }
                );

我想打电话给网络服务,在这种情况下,通过类似下面的网址从twitter获取最新消息;

http://www.domainname.com/Services/Service.svc/GetLatestTweets

当我使用所提到的注册路线时,我在下面添加了stackstrace时收到错误。

[ArgumentException: A catch-all parameter can only appear as the last segment of the route URL.
Parameter name: routeUrl]
   System.Web.Routing.RouteParser.Parse(String routeUrl) +3823656
   System.Web.Routing.Route..ctor(String url, IRouteHandler routeHandler) +24
   System.Web.Mvc.RouteCollectionExtensions.MapRoute(RouteCollection routes, String name, String url, Object defaults, Object constraints, String[] namespaces) +86
   System.Web.Mvc.RouteCollectionExtensions.MapRoute(RouteCollection routes, String name, String url, Object defaults, Object constraints) +28
   System.Web.Mvc.RouteCollectionExtensions.MapRoute(RouteCollection routes, String name, String url, Object defaults) +18
   CMS.Presentation.FrontEnd.Framework.CMSApplication.RegisterRoutes(RouteCollection routes) in C:\Projects\Website\Web.Presentation\FrontEnd\Framework\CMSApplication.cs:62
   CMS.Presentation.FrontEnd.Framework.CMSApplication.Application_Start() in C:\Projects\Website\Web.Presentation\FrontEnd\Framework\CMSApplication.cs:80

[HttpException (0x80004005): A catch-all parameter can only appear as the last segment of the route URL.
Parameter name: routeUrl]
   System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app) +3988565
   System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +191
   System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +325
   System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +407
   System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +375

[HttpException (0x80004005): A catch-all parameter can only appear as the last segment of the route URL.
Parameter name: routeUrl]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +11529072
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +141
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +4784373

我应该做什么或改变所以我可以通过它的网址呼叫网络服务?我正在使用一个简单的wcf-service

2 个答案:

答案 0 :(得分:3)

你无法做到这一点。 .svc扩展已使用与MVC非常不同的处理程序注册,以便处理WCF。如果您尝试更改它,该服务将永远不会工作。您可能需要从控制器操作中调用Web服务,该操作将充当桥接器。

答案 1 :(得分:1)

也许我错过了什么,但似乎你可以

        routes.MapRoute(
            "ServiceHandler",
            "Services/{service}.svc/{*path}",
            new { controller = "services", action = "ParseAndExecuteServiceCall" service = "TwitterService", path = "GetLatestTweets" }
            );

并解析控制器中的远程调用,如果它更复杂的话。路径中只能有一个“catchall”参数,但您可以根据需要使用尽可能多的变量,并使用IRouteConstraint实现或Regex模式限制/定义它们。

另外,回复下面关于.svc vs. .mvc处理程序的评论 - 没有什么可以限制你覆盖IHttpHandler为了做到这一点,你需要在GetHttpHandler()的方法中覆盖IRouteHandler ...然后你可以做任何你想要的处理。