环境: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程序集的引用吗?如果是这样,我如何正确注册?
有什么想法吗?
感谢。
答案 0 :(得分:0)
您是否确定ASP.Net已在服务器上配置,在网站上启用,并且应用程序池已配置为处理应用程序? AFAICT,Json.Net和代码与您的问题无关。
答案 1 :(得分:0)
因此,事实证明这是由于我们部署API而未将其定义为Application Server。这似乎阻止了JSON以某种方式正确解析。一旦我们添加了该角色,事情就开始起作用。