2017-07-24 76 views
0

我有一个使用System.ServiceModel.ServiceHost的现有自托管REST服务(请参阅本页底部的示例:https://msdn.microsoft.com/en-us/library/system.servicemodel.servicehost.aspxOwin自托管服务映射.svc到web api路由(忽略url中的.svc)

我有一个类似于这个httpX:// MyServer:80/SubFolder/Service.svc的地址。历史上,当我们过去使用SOAP和REST端点时,Svc的终点就在那里。但现在它只被访问REST端点的客户端使用。我需要保持Url不变以支持现有客户端

我想将其切换到Owin自托管网站。但我不知道如何使路由处理URL的.svc部分,并基本上忽略它。

例如这个工程 httpX:// MyServer的:80 /子文件夹/服务/ GetTest

这不 httpX:// MyServer的:80 /子文件夹/ Service.svc/GetTest

我一直在寻找网址重新编写选项并找到这些选项,但它们似乎没有解决我的问题。 https://docs.microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

(对不起 - 我不能发表什么,我看了一下,由于计算器限制更多的例子)

我的启动是这样

var server = WebApp.Start<Startup>("httpX://MyServer:80/SubFolder/Service.svc"); 

和我的路由看起来像这样

appBuilder.Map("/api", api => 
    { 
     var config = new HttpConfiguration(); 
     config.MapHttpAttributeRoutes(); 
     api.UseWebApi(config); 
    }); 

使用此设置,如果我浏览到 httpX:// MyServer:80/SubFolder/Service.svc/api/Test I g et a 503.

如果我修改为这样,并从浏览器中的地址中删除.svc它的作品。

var server = WebApp.Start<Startup>("httpX://MyServer:80/SubFolder/Service"); 

回答

0

所以,我终于发现,我的问题是,我有其他网站在相同的子文件夹中的IIS中运行,IIS使用HTTPS和我的新网站是自托管的HTTP,但是这是使我有更多的问题。

我还发现了一个解决方案通过这样

[Route("api/[controller].svc")] 
public class ServiceController : ApiController 
{ 
    [HttpGet] 
    public IHttpActionResult Get() 
    { 
     return Ok(DateTimeOffset.Now); 
    } 
} 

然后将这些路线

config.Routes.MapHttpRoute(
     name: "DefaultWcfWithSvcExt", 
     routeTemplate: "{controller}.svc/{id}", 
     defaults: new { id = RouteParameter.Optional }); 

    config.Routes.MapHttpRoute(
     name: "DefaultWcf", 
     routeTemplate: "{controller}/{id}", 
     defaults: new { id = RouteParameter.Optional }); 

    config.Routes.MapHttpRoute(
     name: "DefaultApi", 
     routeTemplate: "api/{controller}/{id}", 
     defaults: new { id = RouteParameter.Optional } 
    );