在javascript文件中获取正确的root

时间:2015-11-18 23:00:47

标签: javascript asp.net-mvc iis asp.net-web-api

我在解决本地计算机之间的URL根目录以及在IIS上将应用程序部署到我们的开发服务器后遇到问题。

本地运行时的URL是这样的。 http://localhost:57173/

在开发服务器上运行时的url是这样的。 http://ServerName/AppName

我对Web api进行了JQuery Ajax调用,如果不使用尾部斜杠,它将无法在开发服务器上找到该位置。

这是电话

$.ajax({
    type: "GET",
        url: "api/MyApi/Get",
        data: { period: selectedPeriod },
        cache: false,
        success: function (data) {

        }
    });

如果我在开发服务器上的api调用中查看FireBug,并且尾随斜杠,则会显示

http://ServerName/api/MyApi/Get

如果我执行具有尾部斜杠,它将正确解析为此。 (注意现在包含了AppName。)

http://ServerName/AppName/api/MyApi/Get

我在这里缺少什么?当我将它移动到此服务器时,它似乎找不到应用程序的正确根。尾部斜杠在本地没有区别。无论哪种方式都会找到api。有任何想法如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

没有前导斜杠的网址被视为相对网址。您的网址“api / MyApi / Get”将由浏览器相对于包含该脚本的网页的网址解析。

http://ServerName/AppName在浏览器中显示为页面请求,其中AppName是页面的名称,解析URL时不考虑AppName。

http://ServerName/AppName/(尾部斜杠)在浏览器中显示为目录请求,并成为相对URL的基础。

最好的解决方法可能是将http://ServerName/AppName的请求重定向到http://ServerName/AppName/

要从应用程序中进行重定向,请将以下内容插入/ Home / Index控制器操作(在任何其他代码之前)

if (!Request.Url.AbsolutePath.EndsWith("/"))
{
    return Redirect("~/");
}

这会将http://ServerName/AppName的任何请求重定向到http://ServerName/AppName/作为副作用,它还会将http://ServerName/AppName/Index的任何请求重定向到http://ServerName/AppName/,但我不认为会给你带来任何问题。

答案 1 :(得分:1)

除非用户导致事件发生,否则Javascript通常不会运行。我更喜欢使用以下内容,因为无论您在何处部署,它都允许MVC每次都能正确获取准确的路由。

HTML

$(document).ready(function()
{
  $('button').on('click', function()
  {
    var url = $(this).data('url');
    $.ajax({
      type: "GET",
      url: url,
      data: { period: selectedPeriod },
      cache: false,
      success: function (data) {
    });
  });
});

的Javascript

$month = $_GET['m']-1;
$numDays = date("t", strtotime("2015-$month-01"));

在javascript中对网址进行硬编码我认为是不好的做法。

答案 2 :(得分:1)

我也有这个问题,解决它的方法是声明一个javascript变量,它包含两个环境(开发和本地)不同的url部分,并将其添加到每个ajax请求中:

我将该变量放在布局文件(Views / Shared / _Layout.cshtml)中,以便它可以由ASP.NET自动填充,然后全局使用(确保在@RenderSection调用之前创建脚本):

  ...
  <script>
    var baseUrl = @Html.Raw(Json.Encode(Url.Content("~")));
  </sctipt>
  @RenderSection("scripts", required: false) 
</body>
...

然后在ajax调用的url中添加该变量(例如View / Home / Index.cshtml):

    @section scripts {
      $.ajax({
        type: "GET",
        url: baseUrl + "api/MyApi/Get",
        data: { period: selectedPeriod },
        cache: false,
        success: function (data) {} 
     });
   }