【问题标题】:Post/Get works with VS Development server but not with IIS7Post/Get 适用于 VS 开发服务器,但不适用于 IIS7
【发布时间】:2012-10-05 08:31:34
【问题描述】:

我使用 Asp.Net MVC 4(VS2010 SP1,Windows 7)创建了一个网页。它还有一个 api,我可以通过它进行搜索或上传某些东西(数据和文件)。当我在 VS2010 SP1 的开发服务器上部署页面时,一切正常,但是当我选择 IIS (IIS7) 时,api 不再工作。 “IsSuccessStatusCode”似乎是错误的。但是页面本身可以工作并且可以从其他机器访问。

这是我用于内置开发服务器的地址:“http://localhost:56272/api/” 我用于 IIS:“http://127.0.0.1/api/”

我已经为 IIS 创建了一个虚拟目录(由 VS2010 完成)。我是否需要额外配置一些东西,或者它可能是只存在于 IIS 的路由问题?

这是我的客户端 - MyService 类 - 用于 GET:

 public MyService(string serviceAdress) //"http://127.0.0.1/api/"
        {
            this.serviceAdress = new Uri(serviceAdress); //of type Uri
            client = new HttpClient();
            client.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/json"));
        }
    public Task<IEnumerable<Item>> SearchByTag(string tag)
    {
        client.BaseAddress = serviceAdress;
        var getStuffCall=client.GetAsync("Search/ByTag/" + tag);
        var r=getStuffCall.ContinueWith(
            t =>t.Result.IsSuccessStatusCode? (t.Result.Content.ReadAsAsync<IEnumerable<Item>>().Result):new List<Item>()
            );
        return r;
    }

我的服务器端是这样的:

public class SearchController : ApiController
    {
        [HttpGet]
        public IEnumerable<Shared.Item> ByTag(string search)
        {....}
    }

这是WebApiConfig中的路由:

config.Routes.MapHttpRoute(
            name: "SearchApi",
            routeTemplate: "api/Search/{action}/{search}",
            defaults: new
                          {
                              controller="Search"                                  
                          }
        );

【问题讨论】:

  • 能否提供实际的 Http Response 状态码、消息等,而不是“调用失败”?
  • 我现在设法从那个调用中得到了结果消息,它说的是“找不到”。 IIS 的地址错误。我忘了添加我的虚拟文件夹的名称。所以你的问题是一个很好的提示!谢谢。

标签: asp.net-mvc json iis iis-7


【解决方案1】:

IIS 的地址错误。而不是“http://127.0.0.1/api/”,它必须是“http://127.0.0.1/MyVirtualFolderSomething/api/”。

【讨论】:

    【解决方案2】:

    您需要确保网站和应用程序池的用户对您正在执行上传的目录具有写入权限。在开发服务器中,它不会发挥作用,因为它在您具有正常权限的本地(或域)帐户下运行。 IIS7 在受限用户帐户下运行,因此必须调整其权限,或者您要上传到的文件夹需要包含此用户的写入权限。

    调整权限的具体说明可以在这里找到:http://support.microsoft.com/kb/979124

    【讨论】:

    • 但是它应该可以使用 GET 在数据库中执行搜索,对吧? client.GetAsynch(...) 也不适用于 IIS,但适用于内置服务器。
    • http://127.0.0.1/api/ 是 AJAX 调用用来执行 GET 的地址吗?
    • 是的,我已经尝试过使用 IIS。 (以及“localhost:56272/api”以及适用于内置服务器的端口。)
    • @Katharina:AJAX 调用不应违反 127.0.0.1。调用应该与正在使用的网站相关。虽然您可能在该计算机上使用 localhost 地址访问它,但任何远程调用肯定会失败,因为 127.0.0.1 将始终解析到客户端计算机而不是服务器。
    • “相对于网站”是什么意思?这样的地址会是什么样子?我看到的替代方法是使用我的实际 IP 地址(因为服务器是我的机器)。但我想这不是你的意思。
    猜你喜欢
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 2017-01-25
    • 2020-05-26
    • 1970-01-01
    相关资源
    最近更新 更多