Beberapa waktu telah berlalu sejak pertanyaan ini ditanyakan (dan dijawab) tetapi opsi lain adalah menimpa header Terima di server selama pemrosesan permintaan menggunakan MessageHandler seperti di bawah ini:
public class ForceableContentTypeDelegationHandler : DelegatingHandler
{
protected async override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken)
{
var someOtherCondition = false;
var accHeader = request.Headers.GetValues("Accept").FirstOrDefault();
if (someOtherCondition && accHeader.Contains("application/xml"))
{
request.Headers.Remove("Accept");
request.Headers.Add("Accept", "application/json");
}
return await base.SendAsync(request, cancellationToken);
}
}
Di mana someOtherCondition
bisa apa saja termasuk tipe peramban, dll. Ini akan menjadi kasus bersyarat di mana hanya kadang-kadang kita ingin mengganti negosiasi konten default. Kalau tidak sesuai jawaban lain, Anda hanya akan menghapus formatter yang tidak perlu dari konfigurasi.
Anda harus mendaftarkannya, tentu saja. Anda dapat melakukan ini secara global:
public static void Register(HttpConfiguration config) {
config.MessageHandlers.Add(new ForceableContentTypeDelegationHandler());
}
atau berdasarkan rute dengan rute:
config.Routes.MapHttpRoute(
name: "SpecialContentRoute",
routeTemplate: "api/someUrlThatNeedsSpecialTreatment/{id}",
defaults: new { controller = "SpecialTreatment" id = RouteParameter.Optional },
constraints: null,
handler: new ForceableContentTypeDelegationHandler()
);
Dan karena ini adalah penangan pesan, pesan itu akan berjalan baik pada permintaan dan respons ujung pipa seperti sebuah HttpModule
. Jadi, Anda dapat dengan mudah mengakui penggantian dengan tajuk khusus:
public class ForceableContentTypeDelegationHandler : DelegatingHandler
{
protected async override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken)
{
var wasForced = false;
var someOtherCondition = false;
var accHeader = request.Headers.GetValues("Accept").FirstOrDefault();
if (someOtherCondition && accHeader.Contains("application/xml"))
{
request.Headers.Remove("Accept");
request.Headers.Add("Accept", "application/json");
wasForced = true;
}
var response = await base.SendAsync(request, cancellationToken);
if (wasForced){
response.Headers.Add("X-ForcedContent", "We overrode your content prefs, sorry");
}
return response;
}
}