我正在开发一个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
答案 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 ...然后你可以做任何你想要的处理。