如何在javascript中使用RoutePrefix获取Web API方法的有效url

如何在javascript中使用RoutePrefix获取Web API方法的有效url,javascript,asp.net-web-api,typescript,Javascript,Asp.net Web Api,Typescript,WebApiConfig ”。。。 config.Routes.MapHttpRoute( 名称:=“DefaultApi”, routeTemplate:=“api/{controller}/{id}”, 默认值:=New,带有{.id=RouteParameter.Optional} ) '... Global.asax 受保护的子应用程序\u启动(发送方作为对象,e作为事件参数) AreaRegistration.RegisteralAreas() GlobalConfiguration

WebApiConfig

”。。。
config.Routes.MapHttpRoute(
名称:=“DefaultApi”,
routeTemplate:=“api/{controller}/{id}”,
默认值:=New,带有{.id=RouteParameter.Optional}
)
'...
Global.asax

受保护的子应用程序\u启动(发送方作为对象,e作为事件参数)
AreaRegistration.RegisteralAreas()
GlobalConfiguration.Configure(WebApiConfig.Register的地址)
RouteConfig.RegisterRoutes(RouteTable.Routes)
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters)
BundleConfig.RegisterBundles(BundleTable.Bundles)
端接头
Web API控制器


公共类客户控制器
继承ApiController
公共函数saveName(值为MyTypeOfValues)作为IHttpActionResult
"做一些工作人员,
端函数
末级
请求方法:

  var actionurl = "api/customer/saveName";
  $.ajax(actionurl,
  {
     dataType: "JSON",
     data: customerdata,
     type: "POST",
     contentType: "application/json; charset=utf-8",
     error: function() { alert('error');}
  }).done(function (result) { alert(result);});
使用url=
api/customer/saveName
请求已发送到
http://localhost/MySiteName/Customer/ShowCustomer/api/customer/saveName

然后得到错误404

使用url=
/api/customer/saveName
请求已发送到
http://localhost/api/customer/saveName

然后得到错误404

使用url=
http://localhost/MySiteName/api/customer/saveName
我手动创建并通过Fiddler发送-工作正常

在对相关问题的不同回答中,我认为URL在我的案例中不起作用


问题:如何在javascript/typescript中为Web API请求生成有效的url?

因为您需要
http://localhost/MySiteName/api/customer/saveName
您需要主机名之后的所有内容。。。从后面的斜杠开始:

url=/MySiteName/api/customer/saveName


注意:我强烈建议您考虑生成typescript代码来调用它们,而不是在服务器上手动键入并在客户机上复制。这只是一个您确实可以避免的故障点。

我通过在Razor视图(MyView.vbhtml)中使用.NET代码找到了解决方案

此变量传递给viewmodel(typescript)的构造函数
可以使用该值生成Web API url

var actionUrl: string = this._baseurl + "api/customer/saveName";

您应该使用
Url.Content(“~/”
来准确地存储主页面中的基本Url,例如
\u LayoutMain

<script type="text/javascript">
    function resolveClientUrl(relativeUrl) {
        return '@Url.Content("~/")' + relativeUrl;
    }
</script>

问题是
MySiteName
是我的开发站点名称。它将在生产站点中更改。然后您可以尝试在
窗口外对其进行解析。位置
(在
/
上拆分并获取
1
<script type="text/javascript">
    function resolveClientUrl(relativeUrl) {
        return '@Url.Content("~/")' + relativeUrl;
    }
</script>
var url = resolveClientUrl("api/customer/saveName");