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

How to get valid url for Web API method with RoutePrefix in the javascript

本文关键字:API Web 方法 url 有效 获取 RoutePrefix javascript      更新时间:2023-09-26

WebApiConfig

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

Global.asax

Protected Sub Application_Start(sender As Object, e As EventArgs)
    AreaRegistration.RegisterAllAreas()
    GlobalConfiguration.Configure(AddressOf WebApiConfig.Register)
    RouteConfig.RegisterRoutes(RouteTable.Routes)
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters)
    BundleConfig.RegisterBundles(BundleTable.Bundles)
End Sub

Web API控制器

<Authorize()>
<RoutePrefix("api/customer")>
Public Class CustomerController
   Inherits ApiController
    <Route("saveName")>
    <HttpPost>
    Public Function saveName(value As MyTypeOfValues) As IHttpActionResult
        'Do some staff
    End Function
End Class

请求方式:

  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

注意:我强烈建议研究生成类型脚本代码来调用这些代码,而不是在服务器上手动键入并在客户端上复制。只是一点失败,你真的可以没有。

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

var baseUrl: string = "@Url.Content("~/")";

此变量传递给视图模型(typescript(的构造函数
并且可以使用该值生成Web API url

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

您应该使用Url.Content("~/")在主页中准确地存储baseUrl,例如_LayoutMain

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

之后,您可以像下面这样解析relativeUrl

var url = resolveClientUrl("api/customer/saveName");