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 以某种方式被正确解析。一旦我们添加了那个角色,事情就开始起作用了。
环境: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 以某种方式被正确解析。一旦我们添加了那个角色,事情就开始起作用了。