我在解决本地计算机之间的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。有任何想法如何解决这个问题?
答案 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) {}
});
}