我有一个非常基本的Web API示例,我使用example code from this tutorial:
构建 <system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
public class Survey
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
public class SurveysController : ApiController
{
public IEnumerable<Survey> All()
{
using (ITSurveyEntities model = new ITSurveyEntities())
{
return new List<Survey>(
from s in model.Surveys
select new Survey
{
Id = s.Id,
Name = s.Name,
Description = s.Description,
});
}
}
}
它正在利用ITSurveyEntities
,这是一个来自数据库的生成的ADO.NET实体数据模型,它现在只包含一个表Survey
。
简而言之,我不认为我在这里做任何特别的事情。
当我尝试使用类似http://localhost:1681/api/surveys
的内容导航到API时,我收到了回复,但文件名为surveys
,没有扩展名。此外,如果我尝试Save As
并给它说txt
分机,则下载失败。
我希望API会返回文件名surveys.json
,就像示例项目使用products
一样,浏览器会要求我打开或保存文件。
我比较了我的项目和有效教程中的示例代码之间的Web.config
文件。
我已经比较了我的项目和有效教程中的示例代码之间的路由配置。
我试图排除WebDav,因为我的搜索表明它可能是原因。我通过以匹配what's on this blog。
的方式修改Web.config来实现这一点好的,在Joe Enos的指导下,我发现问题是视图模型也被命名为Survey
,因此它引发了一个关于CLR类型和EDM类型之间歧义的错误。
我通过将视图模型重命名为SurveyViewModel
来解决这个问题,而http://localhost:1681/api/surveys
的请求现在返回HTTP 200
并按预期下载文件。
答案 0 :(得分:2)
响应类型(xml,json等)将由请求中的accept标头指定。您没有提到您使用什么浏览器来调用该服务,但我相信浏览器之间的默认接受标头有所不同。如果您只想从webapi返回Json数据,请尝试将以下内容添加到Global.Asax:
GlobalConfiguration.Configuration.Formatters.Clear();
GlobalConfiguration.Configuration.Formatters.Insert(0,new JsonMediaTypeFormatter());
媒体格式化器本质上是如何为浏览器序列化Webapi方法的数据。
答案 1 :(得分:2)
如果您使用Fiddler或浏览器的开发工具查看原始请求和响应,您应该找到有关问题的一些线索。