6

Вопрос по c#, asp.net, xml, asp.net-web-api, odata – Формат ODAP $ WebAPI в xml

для моего приложения ODAP WebAPI я пытаюсь дать своему клиенту (браузеру) решение, в каком формате должен быть вывод данных. как$ формат пока не реализован в ODAP WebAPI, я использую пример Рагурамна здесь:https://gist.github.com/raghuramn/5556691

var queryParams = request.GetQueryNameValuePairs();
var dollarFormat = queryParams.Where(kvp => kvp.Key == "$format").Select(kvp => kvp.Value).FirstOrDefault();

if (dollarFormat != null)
{
    request.Headers.Accept.Clear();
    request.Headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse(dollarFormat));

    // remove $format from the request.
    request.Properties[HttpPropertyKeys.RequestQueryNameValuePairsKey] = queryParams.Where(kvp => kvp.Key != "$format");
}

Это работает для JSON ($ format = application / json; odata = fullmetadata) и JSON light (format = application / json; odata = light), но пока не для xml.

если я добавлю$ = Формат приложения / XML в строку запроса он все еще выводит на JSON Light. как заставить вывод XML?

РЕДАКТИРОВАТЬ:

даже если язаставить XML в Fiddler, отправивТип содержимого: application / xml а такжеПринять: application / xml с запросом ответ просто перечисляет: Content-Type: application / json; OData = minimalmetadata; потокового = TRUE; кодировка = UTF-8

РЕДАКТИРОВАТЬ 2:

Принять: приложение / атом + XML действительно выводит xml в необработанном ответе. К сожалению, «application / atom + xml» создает исключение FormatException в:

request.Headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse("application/atom+xml"));

К вашему сведению, пример Рагурамна потерпит неудачу при использовании строки запроса $ format = application / atom + xml, так как значением dollarFormat будет «application / atom xml», что связано с «+» в URL.

от Schandlich

да, это также выводит JSON ...

от stefjnl

Ты пыталсяtext/xml?

от Markus
2 ответа
3

установка запроса ContentType вместо AcceptHeader сделала свое дело

request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/atom+xml");

Не работает для меня Подскажите, пожалуйста, какие версии библиотек Web API и OData вы используете? Я использую Web API 2.2 (версия сборки 5.2.2) и OData lib v. 6.7.0.

от Eugene D. Gubenkov

Привет, @stefjnl - если возможно, я хотел бы увидеть ваш клиентский код (например, если вы использовали ajax jquery для формулирования запроса ... как он выглядел?)

от bkwdesign
0

Благодаря поиску по ключевым словамthis.Request.Headers.Accept.Add(new

Благодаря поиску по ключевым словамrequest.Headers.Accept.Add а такжеMediaTypeWithQualityHeaderValue которые были представлены по этому вопросу, я нашелCodeProject Статья который фактически представил синтаксис для правильного добавления заголовка Accept и решения той же проблемы:

this.Request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/atom+xml"));

вместоMediaTypeWithQualityHeaderValue.Parse("application/atom+xml") который выбрасывает FormatException.

Похожие вопросы