asp.net web api - Hur man får en giltig URL för Web API-metod med RoutePrefix i JavaScript


WebApiKonfig

'...
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

Webb-API-kontroller

<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

Begär metod:

  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);});

med url=api/customer/saveName skickades en förfrågan till http://localhost/MySiteName/Customer/ShowCustomer/api/customer/saveName
och fick Fel 404

med url=/api/customer/saveName skickades en förfrågan till http://localhost/api/customer/saveName
och fick Fel 404

med url=http://localhost/MySiteName/api/customer/saveName som jag manuellt skapar och skickar med Fiddler - fungerar bra.

I de olika svaren på de relaterade frågorna fungerade de föreslagna URL:erna inte i mitt fall

Fråga: Hur kan jag generera en giltig URL för en Web API-förfrågan i JavaScript/TypeScript?

Svar #1

Eftersom du vill ha http://localhost/MySiteName/api/customer/saveName behöver du allt efter värdnamnet ... med början från snedstrecket i slutet:

url = /MySiteName/api/customer/saveName

Observera: Jag rekommenderar starkt att titta på att generera TypeScript-kod för att anropa dessa istället för att skriva dem för hand på servern och duplicera på klienten. Bara en felpunkt som du verkligen kan klara dig utan.

Svar #2

Jag hittade en lösning genom att använda .NET-kod i Razor-vyn (MyView.vbhtml)

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

Denna variabel skickas till konstruktören för viewmodel (TypeScript)
och Web API-URL kan genereras med hjälp av det värdet

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