在这篇文章中,我们将为您详细介绍如何从WCFREST方法返回自定义HTTP状态代码?的内容,并且讨论关于response返回自定义状态码的相关问题。此外,我们还会涉及一些关于angularjs–如何从
在这篇文章中,我们将为您详细介绍如何从WCF REST方法返回自定义HTTP状态代码?的内容,并且讨论关于response返回自定义状态码的相关问题。此外,我们还会涉及一些关于angularjs – 如何从$resource请求获取Http状态代码、asp.net – 从ActionFilterAttribute返回自定义HTTP代码、asp.net – 从Web API获取空的500 http状态代码、c# – 如何从IHttpActionResult方法返回自定义变量?的知识,以帮助您更全面地了解这个主题。
本文目录一览:- 如何从WCF REST方法返回自定义HTTP状态代码?(response返回自定义状态码)
- angularjs – 如何从$resource请求获取Http状态代码
- asp.net – 从ActionFilterAttribute返回自定义HTTP代码
- asp.net – 从Web API获取空的500 http状态代码
- c# – 如何从IHttpActionResult方法返回自定义变量?
如何从WCF REST方法返回自定义HTTP状态代码?(response返回自定义状态码)
如果WCF
REST调用中出现问题,例如找不到请求的资源,我该如何在OperationContract方法中使用HTTP响应代码(例如,将其设置为类似HTTP
404的代码)?
angularjs – 如何从$resource请求获取Http状态代码
angular.module('myApp',['ngResource']); angular.module('myApp').controller('myCtrl',function ($scope,UserService) { UserService.save({name:'Sahar',email:'abc.abc@yahoo.com'}).$promise .then(function (response) { console.log('Error status: ' + response.status); return response; }); }); angular.module('myApp') .factory('UserService',function ($resource) { return $resource('http://jsonplaceholder.typicode.com/users/:user',{user:'@user'}); });
解决方法
return $resource('http://jsonplaceholder.typicode.com/users/:user',user:'@user',{ query: { method: 'GET',transformResponse: function (data,headers,status) { var ret = {data: data,status: status}; return ret; }} });
您将在{status}键和{status}键中获取{data}键和“Status Code”(例如200,500,403)中的数据
asp.net – 从ActionFilterAttribute返回自定义HTTP代码
public class Throttle : ActionFilterattribute { public override async Task OnActionExecutingAsync(HttpActionContext context,CancellationToken cancellationToken) { // ... if (throttle) { throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Conflict)); } } }
但是,我无法返回错误代码429,因为它不在HttpStatusCode枚举中.有没有办法返回自定义错误代码?
解决方法
var response = new HttpResponseMessage { StatusCode = (HttpStatusCode)429,ReasonPhrase = "Too Many Requests",Content = new StringContent(string.Format(CultureInfo.InvariantCulture,"Rate limit reached. Reset in {0} seconds.",data.ResetSeconds)) }; response.Headers.Add("Retry-After",data.ResetSeconds.ToString(CultureInfo.InvariantCulture)); actionContext.Response = response;
希望这可以帮助
asp.net – 从Web API获取空的500 http状态代码
根据this article中给出的建议,我使用了DataContractAttribute并在所有成员上设置了IsReference = true.我还在我要序列化的所有属性上提供了DataMemberAttribute.
为了确保序列化程序不再出现任何问题,我只选择不序列化导航属性.
但是,我的catch块中仍然遇到异常.例外的细节如下:
_innerException: {"Type 'System.Data.Entity.DynamicProxies.Author_615FB9F8BB22B55A7CA168DA5ED29EC6A0B59F62FD79D1346045351BE2F163A4' with data contract name 'Author_615FB9F8BB22B55A7CA168DA5ED29EC6A0B59F62FD79D1346045351BE2F163A4: http://schemas.datacontract .org/2004/07/System.Data.Entity.DynamicProxies' is not expected. Consider using a DataContractResolver or add any types not kNown statically to the list of kNown types - for example,by using the KNownTypeAttribute attribute or by adding them to the list of kNown types passed to DataContractSerializer."}
我可以但不希望:
1)禁用代理创建.我可以删除代理创建只是为了序列化,我可能会这样做.但我也想知道为什么我仍然得到例外以及我能做些什么.
2)删除循环引用.原因:这些类型的引用在Entity Framework生成的模型中非常常见.如果我要在模型中做一个800 – 1000个类的大项目,那么通过删除循环引用来实现它是一个噩梦.
我在下面描述了这个小尖峰解决方案的架构元素.
数据库架构
Id AuthorName ------------------------------- 1 Charles Dickens 2 Charles Petzold 3 Charles Darwin 4 Charles Chaplin 5 Leo Tolstoy 6 Fydor Dostoevsky 7 Ayn Rand 8 Napolean Hill 9 Claude M. Bristol 10 Edward Dwight Easty 11 O. Henry 12 William Shakespeare 13 Juwal Lowy 14 Jeffrey Richter 15 Chris Sells 16 Don Box 17 Steven Pinker 18 Jim Rohn 19 George Eliot 20 Sathyaish Chakravarthy Id Title AuthorId ----------- -------------------------------------------------- ----------- 1 Nicholas Nickleby 1 Id BookId Review ----------- --------------------------------------------------------------- 1 1 How do I kNow? I haven't read it.
模型
using System.Collections.Generic; using System.Runtime.Serialization; namespace BookReviewsModel { [DataContract(IsReference = true)] public partial class Author { [DataMember] public virtual int Id { get; set; } [DataMember] public virtual string AuthorName { get; set; } public virtual ICollection<Book> Books { get; set; } } } namespace BookReviewsModel { [DataContract(IsReference = true)] public partial class Book { [DataMember] public virtual int Id { get; set; } [DataMember] public virtual string Title { get; set; } [DataMember] public virtual int AuthorId { get; set; } public virtual Author Author { get; set; } public virtual ICollection<BookReview> BookReviews { get; set; } } } namespace BookReviewsModel { [DataContract(IsReference = true)] public partial class BookReview { [DataMember] public virtual int Id { get; set; } [DataMember] public virtual int BookId { get; set; } [DataMember] [AllowHtml] public virtual string Review { get; set; } public virtual Book Book { get; set; } } }
控制器代码
namespace BookReviews.Controllers { public class AuthorController : ApiController { [HttpGet] public IEnumerable<Author> Index() { try { using (var context = new BookReviewEntities()) { var authors = context.Authors.ToList(); var str = Serialize(new XmlMediaTypeFormatter(),authors); System.Diagnostics.Debugger.Break(); System.Diagnostics.Debug.Print(str); return authors; } } catch (Exception ex) { var responseMessage = new HttpResponseMessage { Content = new StringContent("Couldn't retreive the list of authors."),ReasonPhrase = ex.Message.Replace('\n',' ') }; throw new HttpResponseException(responseMessage); } } string Serialize<T>(MediaTypeFormatter formatter,T value) { Stream stream = new MemoryStream(); var content = new StreamContent(stream); formatter.WritetoStreamAsync(typeof(T),value,stream,content,null).Wait(); stream.Position = 0; return content.ReadAsstringAsync().Result; } } }
解决方法
此问题已在AspNetWebStack Nightly Build中得到解决.
我没有跟踪哪个签入更正了行为,因为我正在跟进多个问题.
您可以通过向Package Manager配置添加http://www.myget.org/F/aspnetwebstacknightly/来更新解决方案以使用最新的每晚软件包,然后从此附加存储库中显式更新.
据我所知,1/18夜间在我的解决方案中是稳定的(odata查询也会更快地返回.)
解决方法:
如果您不能使用最新的aspnetwebstack构建,那么如果您不需要XML格式的源,则可能存在解决方法.
http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization
本文档介绍了如何配置web-api控制器使用的格式化程序,还介绍了如何处理循环引用,以及如何重新配置/替换默认的xml格式化程序.
作为解决方法,您可以在Application_Start期间删除xml格式化程序:
var xmlFormatter = config.Formatters.XmlFormatter; if (xmlFormatter != null) { config.Formatters.Remove(xmlFormatter); }
c# – 如何从IHttpActionResult方法返回自定义变量?
我想要的JSON返回:
{“CustomerID”: 324}
我的方法:
[Route("api/createcustomer")] [HttpPost] [ResponseType(typeof(Customer))] public IHttpActionResult CreateCustomer() { Customer NewCustomer = CustomerRepository.Add(); return CreatedAtRoute<Customer>("DefaultApi",new controller="customercontroller",CustomerID = NewCustomer.ID },NewCustomer); }
JSON返回:
“ID”: 324,
“Date”: “2014-06-18T17:35:07.8095813-07:00”,
以下是我尝试过的一些回报,或者给了我uri null错误,或者给了我类似于上面例子的回复.
return Created<Customer>(Request.RequestUri + NewCustomer.ID.ToString(),NewCustomer.ID.ToString()); return CreatedAtRoute<Customer>("DefaultApi",new { CustomerID = NewCustomer.ID },NewCustomer);
使用httpresponsemessage类型方法,可以解决此问题,如下所示.但是我想使用IHttpActionResult:
public HttpResponseMessage CreateCustomer() { Customer NewCustomer = CustomerRepository.Add(); return Request.CreateResponse(HttpStatusCode.Created,new { CustomerID = NewCustomer.ID }); }
解决方法
[Route("api/createcustomer")] [HttpPost] //[ResponseType(typeof(Customer))] public IHttpActionResult CreateCustomer() { ... string location = Request.RequestUri + "/" + NewCustomer.ID.ToString(); return Created(location,new { CustomerId = NewCustomer.ID }); }
现在ResponseType不匹配.如果需要此属性,则需要创建新的返回类型,而不是使用匿名类型.
public class CreatedCustomerResponse { public int CustomerId { get; set; } } [Route("api/createcustomer")] [HttpPost] [ResponseType(typeof(CreatedCustomerResponse))] public IHttpActionResult CreateCustomer() { ... string location = Request.RequestUri + "/" + NewCustomer.ID.ToString(); return Created(location,new CreatedCustomerResponse { CustomerId = NewCustomer.ID }); }
另一种方法是使用Customer类上的DataContractAttribute来控制序列化.
[DataContract(Name="Customer")] public class Customer { [DataMember(Name="CustomerId")] public int ID { get; set; } // DataMember omitted public DateTime? Date { get; set; } }
然后只返回创建的模型
return Created(location,NewCustomer); // or return CreatedAtRoute<Customer>("DefaultApi",NewCustomer);
关于如何从WCF REST方法返回自定义HTTP状态代码?和response返回自定义状态码的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于angularjs – 如何从$resource请求获取Http状态代码、asp.net – 从ActionFilterAttribute返回自定义HTTP代码、asp.net – 从Web API获取空的500 http状态代码、c# – 如何从IHttpActionResult方法返回自定义变量?的相关信息,请在本站寻找。
本文标签: