Использование NameValueCollection в C # webservice дает не сериализуемую ошибку XML - PullRequest
7 голосов
/ 19 марта 2009

Я получаю это сообщение об ошибке при попытке добавить веб-ссылку в мой прокси-проект ASMX:

**"To be XML serializable, types which inherit from ICollection must have an    implementation of Add(System.String) at all levels of their inheritance hierarchy. System.Collections.Specialized.NameValueCollection does not implement Add(System.String)"**

Мне нужно передать пары имя-значение в мой веб-сервис, и вот что я придумал:

public class FileService : System.Web.Services.WebService
{

    [WebMethod]
    public string UploadFile(byte[] incomingArray
        , string FileName
        , long FileLengthInBytes
        , NameValueCollection nvcMetaData)

Теперь я понимаю, что мне нужна помощь, чтобы изменить это (я новичок в C # и в этой части .Net Framework). Если я смогу заставить это работать, ColdFusion должен будет вызывать мой веб-сервис (сейчас я использую страницу ASPX для вызова веб-сервиса). Поэтому, что бы я ни предложил для передачи переменного числа пар ИМЯ-ЗНАЧЕНИЕ, мне нужно, чтобы он вызывался CF. Заранее спасибо.

Ответы [ 3 ]

5 голосов
/ 19 марта 2009

В качестве альтернативы вы можете просто определить простой класс NameValue и получить массив.

public class NameValue
{
   public string Name{get;set;}
   public string Value{get;set;}
}

[WebMethod]
public string UploadFile(byte[] incomingArray
    , string FileName
    , long FileLengthInBytes
    , NameValue[] nvcMetaData)

Если на стороне клиента у вас есть коллекция NameValueCollection, вы можете легко сопоставить ее с вашим типом. Проверьте образец, который я разместил в этом вопросе

2 голосов
/ 19 марта 2009

К сожалению, все структуры словарей библиотеки .NET не сериализуемы. Я слышал хорошие вещи о этом коде - возможно, это поможет.

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

0 голосов
/ 01 декабря 2011

Если вы используете объект как тип, ScriptService автоматически / тайно сериализует его в словарь, чтобы вы могли использовать его так:

[WebMethod, ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public object MyServiceMethod(int recordid, object data)
{
   Dictionary<String, Object> noway = (Dictionary<String, Object>)data;
   // ...
   return noway;

}

...