开发者

C# call webservice by url

开发者 https://www.devze.com 2023-01-22 20:19 出处:网络
I\'m working on a webapplication and i want to call a webservice through it\'s url. How can i achieve this?

I'm working on a webapplication and i want to call a webservice through it's url. How can i achieve this?

I've got the following route registered in my global.asax;

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

And i want to call the webservice, in this case to get the latest messages from twitter by an url similar to the one below;

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

When i use the registered route as mentioned i'm getting an error with the stackstrace i added bel开发者_JAVA技巧ow.

[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

What should i do or change so i can call the webservice by it's url? I'm working with a simple wcf-service


You cannot achieve this. The .svc extension is already registered with a very different handler than MVC in order to process WCF. If you try to change it the service will never work. You might need to call the web service from your controller action which will act as bridge.


Maybe I am missing something, but it seems like you could just

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

and parse the remote call in the controller, if it is more complex. You can only have one "catchall" parameter in routes, but you can use as many variables as you want, and restrict/define them with IRouteConstraint implementations or Regex patterns.

Also, with response to the comment below about the .svc vs. .mvc handler - There is nothing to limit you from overriding the IHttpHandler In order to do this, you would need to override the IRouteHandler in's method for GetHttpHandler()... Then you can do whatever processing you want.

0

精彩评论

暂无评论...
验证码 换一张
取 消