我希望将ASP.NET Web API添加到Visual Studio 2012中开发的ASP.NET MVC 4 Web应用程序项目中.我必须执行哪些步骤才能将正常运行的Web API添加到项目中?我知道我需要一个从ApiController派生的控制器,但这就是我所知道的.
如果我需要提供更多详细信息,请与我们联系.
asp.net-mvc asp.net-mvc-4 asp.net-web-api visual-studio-2012
我的问题是我希望通过来自ASP.NET MVC控制器方法的ActionResult返回camelCased(而不是标准的PascalCase)JSON数据,由JSON.NET序列化.
举个例子来考虑以下C#类:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
默认情况下,当从MVC控制器返回此类的实例作为JSON时,它将按以下方式序列化:
{
"FirstName": "Joe",
"LastName": "Public"
}
Run Code Online (Sandbox Code Playgroud)
我希望它被序列化(通过JSON.NET):
{
"firstName": "Joe",
"lastName": "Public"
}
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?
几个月前,微软决定更改HttpResponseMessage类.之前,您可以简单地将数据类型传递给构造函数,然后返回包含该数据的消息,但不再是.
现在,您需要使用Content属性来设置消息的内容.问题是它是HttpContent类型,我似乎无法找到将字符串转换为HttpContent的方法.
有谁知道如何处理这个问题?非常感谢.
在某些情况下,我有NewtonSoft JSON.NET,在我的控制器中,我只是从我的控制器返回Jobject,一切都很好.
但我有一个案例,我从另一个服务获得一些原始JSON,需要从我的webAPI返回它.在这种情况下,我不能使用NewtonSOft,但如果可以的话,我会从字符串创建一个JOBJECT(这似乎是不需要的处理开销)并返回,并且一切都将与世界相得益彰.
但是,我想简单地返回这个,但是如果我返回字符串,那么客户端会收到一个JSON包装器,我的上下文是一个编码字符串.
如何从WebAPI控制器方法中显式返回JSON?
为了使进度报告过程更可靠并将其与请求/响应分离,我正在Windows服务中执行处理并将预期的响应持久保存到文件中.当客户端开始轮询更新时,意图是控制器将文件的内容(无论它们是什么)作为JSON字符串返回.
该文件的内容已预先序列化为JSON.这是为了确保没有任何阻碍响应的方式.不需要处理(没有将文件内容读入字符串并返回它)以获得响应.
我最初虽然这很简单,但事实并非如此.
目前我的控制器方法看起来如此:
[HttpPost]
public JsonResult UpdateBatchSearchMembers()
{
string path = Properties.Settings.Default.ResponsePath;
string returntext;
if (!System.IO.File.Exists(path))
returntext = Properties.Settings.Default.EmptyBatchSearchUpdate;
else
returntext = System.IO.File.ReadAllText(path);
return this.Json(returntext);
}
Run Code Online (Sandbox Code Playgroud)
Fiddler将此作为原始回复
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Mon, 19 Mar 2012 20:30:05 GMT
X-AspNet-Version: 4.0.30319
X-AspNetMvc-Version: 3.0
Cache-Control: private
Content-Type: application/json; charset=utf-8
Content-Length: 81
Connection: Close
"{\"StopPolling\":false,\"BatchSearchProgressReports\":[],\"MemberStatuses\":[]}"
Run Code Online (Sandbox Code Playgroud)
以下内容可能会在以后更改,但是现在,当我生成响应类并将其作为JSON返回时,这就像普通人一样.
this.CheckForUpdate = function () {
var parent = this;
if (this.BatchSearchId != null && WorkflowState.SelectedSearchList != "") {
showAjaxLoader …
Run Code Online (Sandbox Code Playgroud) 我想要我的WEB API方法将XML对象返回给调用应用程序.目前它只是将XML作为字符串对象返回.这不是不是吗?如果是这样,你怎么告诉webapi get方法它返回XML类型的对象?
谢谢
编辑:Get方法的示例:
[AcceptVerbs("GET")]
public HttpResponseMessage Get(int tenantID, string dataType, string ActionName)
{
List<string> SQLResult = MyWebSite_DataProvidor.DB.spReturnXMLData
("SELECT * FROM vwContactListing FOR XML AUTO, ELEMENTS").ToList();
string AllResults = "";
for (int i = 0; i < SQLResult.Count - 1; i++)
{
AllResults += SQLResult[i];
}
string sSyncData = "<?xml version=\"1.0\"?> " + AllResults;
HttpResponseMessage response = new HttpResponseMessage();
response.Content = new StringContent(sSyncData);
return response;
}
Run Code Online (Sandbox Code Playgroud)
它有点hacky因为我仍处于原型设计阶段.当我证明其可行时,将重构.
我试图使用ASP.NET Web API返回一个JSON文件(用于测试).
public string[] Get()
{
string[] text = System.IO.File.ReadAllLines(@"c:\data.json");
return text;
}
Run Code Online (Sandbox Code Playgroud)
在Fiddler中,它确实显示为Json类型,但是当我在Chrome中调试并查看它出现的对象和各行的数组(左)时.正确的图像是我使用它时对象应该是什么样子.
任何人都可以告诉我应该返回什么以正确的格式获得Json结果?
我读到默认情况下,Web API将返回JSON数据,但出于某种原因,在创建API时,它返回XML而不是JSON.
public class CurrencyController : ApiController
{
private CompanyDatabaseContext db = new CompanyDatabaseContext();
// GET api/Currency
public IEnumerable<Currency> GetCurrencies()
{
return db.Currencies.AsEnumerable();
}
}
Run Code Online (Sandbox Code Playgroud)
我没有修改任何与众不同的东西,所以我很难过
是否可以默认从ASP.NET Web API而不是XML返回json?
我有一个相当简单的Web API应用程序,目前有一个路由设置.如果用户尝试访问任何其他路由,则会返回404,但404的主体是HTML而不是JSON(这是他们的接受标头要求的).什么是最简单的(最少的代码/配置添加到我的项目)方式让IIS响应具有JSON错误响应而不是网页的不存在路由的请求?
同样的问题适用于403s.如果我尝试导航到我的应用程序的根目录,我会再次返回403,再次作为网页.我更希望这是一个404,但更大的问题是如何让我的应用程序的所有响应都是JSON而不是只有有效路由的响应?我提到了403,因为我正在寻找一个更广泛的解决方案,而不仅仅是设置一个全能路由,因为我不相信这将帮助我解决403或在控制器动作之外发生的任何其他随机异常.
我希望我的应用程序尊重请求中的接受标头.但是,由于我的API现在只支持JSON,我愿意(暂时)它总是用JSON响应.
我正在使用WebAPI 2.2和.NET 4.5.2.
编辑
这不是格式化程序问题.格式化程序正确应用于成功的消息,尊重请求中的接受标头.这特别是未处理的路由和Web服务器错误(例如在尝试访问Web根目录时被禁止)的问题.
编辑2
重现步骤:
我期望的是,当我导航到http://localhost:<port>/api/do_stuff
我看到Success!
XML或JSON时,取决于接受标题(我这样做),当我导航到任何其他页面时,我应该看到Failure!
(我不这样做).相反,当我导航到任何其他页面时,我看到IIS的404响应.
DefaultController.cs:
[RoutePrefix("api")]
public class DefaultController : ApiController
{
[HttpGet]
[Route("do_stuff")]
public String DoStuff()
{
return "Success!";
}
}
Run Code Online (Sandbox Code Playgroud)
WebApiConfig.cs:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes(); …
Run Code Online (Sandbox Code Playgroud)