web-api - 适用于开发,而不适用于实际服务器 - 未解析 JSON

web-api - Works on development, not on actual server - No JSON parsed

环境:Windows服务器 2012 R2,IIS 8.5。

我构建了一个 API,它在我们的开发环境中创造了奇迹。它读取一个文本文件,然后将内容序列化为 JSON 和 returns。我做了一个文件系统部署到我们的服务器。我创建了一个指向该文件夹的网站,并认为这可以很好地解决问题。我将该网站设为默认网站。

我的应用程序包含处理两个不同路由的路由:

/api/twitter/{date} /api/twitter/{date}/{id}

任何一条路线都应该吐出一个 JSON 字符串。

进入服务器,输入 localhost 调出本地主机屏幕。 localhost/api 产生一个 404.0 not found,这听起来不错,因为没有办法处理它。 localhost/api/twitter/20160201,应该有效,但实际上没有任何作用。它似乎想要下载一个名为 20160201 的文件。单击 open 没有任何作用,单击 save 会产生一个永远不会完成的空文件。我怀疑 JSON.NET 没有被正确调用,或者服务器可能以某种方式不期望 JSON 返回到浏览器。

在错误消息中,我可以看到物理路径至少指向正确的路径。

这是控制器部分:

// Default route: 
[Route("api/twitter/{date}")]
public Twitter GetTweets(int date) {
    return LoadJson(date);
}

// Additional route for date + id for incremental loading
[Route("api/twitter/{date}/{id}")]
[HttpGet]
public Twitter GetTweets(int date, Int64 id) {
    return GetTweetsIncremental(date, id);
}

// more code

WebApiConfig

GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add(new RequestHeaderMapping("Accept", "text/html", StringComparison.InvariantCultureIgnoreCase, true, "application/json")); // Web API 配置和服务

    // Web API routes
    config.MapHttpAttributeRoutes();

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{date}",
        defaults: new { date = RouteParameter.Optional}
    );

Global.asax 包含此代码段以使 api 吐出 JSON 而不是 XML:

    // Remove the XML formatter
   //  GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
    var serializerSettings =
      GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
    var contractResolver =
      (DefaultContractResolver)serializerSettings.ContractResolver;
    contractResolver.IgnoreSerializableAttribute = true;

它依赖于 Newtonsoft.Json,我将其视为参考,并且我正在代码中使用它。我还将其标记为 "Copy Local = true" 引用,以确保发布会将 DLL 推送到服务器。

在我的 Web.config 中,我看到以下程序集绑定(注意缺少 Newtonsoft.json):

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
  </dependentAssembly>
</assemblyBinding>

我现在对正在发生的事情感到很困惑。我最初怀疑是 404 错误,这让我尝试了不同的事情,但我得出的结论是,因为当我访问实际路线时发生了这种情况,所以我找错了树。我只是不知道出了什么问题。

是否缺少对 newtonsoft 程序集的引用?如果是这样,我该如何正确注册?

有什么想法吗?

谢谢。

404 对我来说意味着服务器无法识别正确的控制器。 “它似乎想要下载一个名为 20160201 的文件”。

您确定 ASP.Net 在服务器上配置,在网站上启用,并且应用程序池配置为处理应用程序吗? AFAICT,Json.Net 和代码与您的问题无关。

所以这是由于我们部署的服务器 API 未被定义为应用程序服务器。这似乎阻止了 JSON 以某种方式被正确解析。一旦我们添加了那个角色,事情就开始起作用了。