Не удалось создать образец для типа мультимедиа «application/x-www-form-urlencoded».

Недавно я начал создавать веб-API ASP.net.

По какой-то причине я продолжаю получать эту ошибку при просмотре автоматически созданной справочной документации:

введите здесь описание изображения

Это для метода POST

Образцы отображаются нормально для application/json и application/xml

Я не совсем уверен, но приложение/-x-www-form-urlencoded продолжает появляться

Я немного погуглил ошибку, но не могу найти, что может быть причиной этого

Я искренне ценю любую помощь, которая может быть предоставлена, также, пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы.


person 99823    schedule 02.04.2013    source источник


Ответы (3)


Это ожидаемое поведение. Генерация образца HelpPage использует фактические средства форматирования, присутствующие в HttpConfiguration, для «записи» образцов объектов. FormUrlEncodedMediaTypeFormatter не может «записывать» какой-либо тип, поэтому HelpPage не может генерировать образцы для него. В качестве обходного пути вы можете явно предоставить образец для определенного типа (как показано в закомментированном коде Areas\HelpPage\App_Start\HelpPageConfig.cs).

config.SetSampleForType("[0]=foo&[1]=bar", new MediaTypeHeaderValue("application/x-www-form-urlencoded"), typeof(IEnumerable<string>));
person Kiran Challa    schedule 02.04.2013
comment
Я начал подозревать, что это ожидаемое поведение. Спасибо за информацию. - person 99823; 03.04.2013
comment
Если вы спросите меня - это совершенно неожиданное поведение. Если страница справки не может предоставить эти образцы, зачем показывать запросы такого типа? Есть ли способ отключить его? - person Greg Z.; 15.01.2015
comment
Установка debug="false" в вашем файле web.config предотвратит отображение ошибки и покажет, что образец недоступен. вместо. - person DigitalDan; 06.05.2015
comment
Где в веб-конфигурации мы должны поместить debug="false" @DigitalDan? И да, я согласен, он никогда не должен показывать этот код внешнему пользователю... это смешно! - person Mark Pieszak - Trilon.io; 01.08.2016
comment
@MarkPieszak <configuration>...<system.web>...<compilation debug="false" ... Между ними могут быть другие элементы/атрибуты (где я поставил ..., это не следует менять). Подробнее см. здесь: msdn.microsoft.com/ ru/библиотека/ - person DigitalDan; 08.08.2016

Ответ помог мне, но мне надоело писать пример для каждого типа, о котором система не знала... в итоге я сделал следующее

Type[] types = { typeof(MyType), typeof(AnotherType), *add more here* };

foreach(Type t in types)
{
    List<string> propExample = new List<string>();
    foreach(var p in t.GetProperties())
    {
        propExample.Add(p.Name + "=value");
    }

    config.SetSampleForType(string.Join("&", propExample), new MediaTypeHeaderValue("application/x-www-form-urlencoded"), t);            
}

Кто-то мог бы поумнеть и расширить его так, чтобы он вставлял значения по умолчанию в зависимости от типа свойства, но для моих целей этого было достаточно.

person Adween    schedule 24.02.2016

Я понимаю, что опаздываю на вечеринку...

Заимствуя ответ от @Adween и пытаясь решить проблему.

«Кто-то мог бы поумнеть и расширить его так, чтобы он вставлял значения по умолчанию в зависимости от типа свойства…»

Я попытался вставить образцы значений параметров. Мне не нравится, что я должен URLEndcode значение образца, но мне больше нравится вывод.

foreach ( Type t in new Type[] { typeof( MyType ) } )
{
    List<string> propExample = new List<string>();
    foreach ( var p in t.GetProperties() )
    {
        propExample.Add( p.Name + "=" + HttpUtility.UrlEncode( config.GetHelpPageSampleGenerator().GetSampleObject(p.PropertyType).ToString() ) );
    }

    config.SetSampleForType( string.Join( "&", propExample ), new MediaTypeHeaderValue( "application/x-www-form-urlencoded" ), t );
}
person Thegoss    schedule 05.12.2019