web-api - 适用于开发,而不是实际的服务器 - 无需解析JSON

时间:2016-03-01 16:20:34

标签: asp.net iis iis-8.5

环境:Windows Server 2012 R2,IIS 8.5。

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

我的应用包含处理两条不同路线的路由:

/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返回到breowser。

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

这是控制器部分:

// 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&#34));         // 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程序集的引用吗?如果是这样,我如何正确注册?

有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

因此,事实证明这是由于我们部署API而未将其定义为Application Server。这似乎阻止了JSON以某种方式正确解析。一旦我们添加了该角色,事情就开始起作用。