gpt4 book ai didi

c# - 覆盖 ExecuteAsync 方法以避免重复 Web Api 操作方法的代码

转载 作者:行者123 更新时间:2023-11-30 23:28:50 24 4
gpt4 key购买 nike

在我的 api Controller 操作方法中。我正在为获取请求使用内容协商。代码是:

IContentNegotiator negotiator = this.Configuration.Services.GetContentNegotiator();
ContentNegotiationResult result = negotiator.Negotiate(typeof(OfficeDetailsDto), this.Request, this.Configuration.Formatters);
if (result == null)
{
var responseErr = new HttpResponseMessage(HttpStatusCode.NotAcceptable);
throw new HttpResponseException(responseErr);
}

但现在我想通过继承 ApiController 来创建一个 BaseAPIController Controller ,并希望重写基类的方法 以获得上述代码,以便我不必在我所有的 Controller 类中一次又一次地编写这段代码。它还将使我的 Controller 操作方法变薄。

谁能给我任何建议或 sample 。

最佳答案

ApiController 已经提供了开箱即用的处理内容协商的能力,但是如果您真的想自定义内容,您可以创建自己的通用方法,您可以从继承的 Controller 调用这些方法谈判过程。

你的BaseAPIController

public abstract class BaseAPIController : ApiController {    
protected virtual HttpResponseMessage NegotiatedContent<T>(HttpStatusCode statusCode, T content) {
var type = typeof(T);
var request = this.Request;
var formatters = this.Configuration.Formatters;
var negotiator = this.Configuration.Services.GetContentNegotiator();

var result = negotiator.Negotiate(type, request, formatters );
if (result == null) {
var response = new HttpResponseMessage(HttpStatusCode.NotAcceptable);
throw new HttpResponseException(response));
}

return new HttpResponseMessage() {
StatusCode = statusCode,
Content = new ObjectContent<T>(
content, // What we are serializing
result.Formatter, // The media formatter
result.MediaType.MediaType // The MIME type
)
};
}
}

这段代码相当于ApiController 自动提供的内容。

一个潜在的 OfficeDetailsController,具有更精简的操作方法

public class OfficeDetailsController : BaseAPIController {    
public HttpResponseMessage GetOfficeDetails(int id) {
var item = new OfficeDetailsDto() { Id = id, Name = "Gizmo"};
// what ever else needs to be done to the item
// ...
return NegotiatedContent(HttpStatusCode.Ok, item);
}
}

这是一个使用 ApiController 默认值做同样事情的例子。

public class OfficeDetailsController : ApiController {    
public IHttpActionResult GetOfficeDetails(int id) {
var item = new OfficeDetailsDto() { Id = id, Name = "Gizmo"};
// what ever else needs to be done to the item
// ...
return Ok(item);
}
}

关于c# - 覆盖 ExecuteAsync 方法以避免重复 Web Api 操作方法的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35809617/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com