Параметр POST AspNet WebApi имеет значение NULL при отправке XML

У меня есть служба веб-API, изначально использующая бета-биты, которые я перестроил, используя биты-кандидаты на выпуск, и теперь у меня есть эта проблема.

У меня есть действие POST, которое принимает сложный параметр в качестве единственного параметра. Когда я отправляю запрос с телом в формате json, объект десериализуется, как и ожидалось, но если вместо этого я отправляю XML, параметр равен нулю.

В бета-версии я обошел эту проблему, отключив привязку модели, как описано в сообщении блога Карлоса Фигейры Отключение привязки модели в бета-версии веб-API ASP.NET

. Однако в RC они удалили IRequestContentReadPolicy, которую реализовывал этот метод.

Мои действия:

public List Post([FromBody]Models.AimiRequest requestValues)
{
  try
  {
    if (requestValues == null)
    {
      var errorResponse = new HttpResponseMessage();
      errorResponse.StatusCode = HttpStatusCode.NotFound;
      errorResponse.Content = new StringContent("parameter 'request' is null");
      throw new HttpResponseException(errorResponse);
    }
    var metadataParams = new List>();
    foreach (Models.MetadataQueryParameter param in requestValues.Metadata)
    {
      metadataParams.Add(new KeyValuePair(param.Name, param.Value));
    }
    List data = _payloadService.FindPayloads(metadataParams, requestValues.ContentType, requestValues.RuleTypes);
    var retVal = AutoMapper.Mapper.Map, List>(data);
    return retVal; // new HttpResponseMessage>(retVal);
  }
  catch (System.Exception ex)
  {
    _logger.RaiseError(ex);
    throw;
  }
}

Моя модель:

public class AimiRequest
{
  public MetadataQueryParameter[] Metadata { get; set; }
  public string ContentType { get; set; }
  public string RuleTypes { get; set; }
}

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

Я тестирую использование Fiddler для отправки запросов в службу.

Это работает и возвращает мне ожидаемые результаты.

POST http://localhost:51657/api/search HTTP/1.1
User-Agent: Fiddler
Content-Type: application/json; charset=utf-8
Accept: application/json
Host: localhost:51657
Content-Length: 219

{
  "ContentType":null,
  "RuleTypes":null,
  "Metadata":[
    {
    "Name":"ClientName",
    "Value":"Client One"
    },
    {
    "Name":"ClientName",
    "Value":"Client Two"
    }
  ]
}

Это не удается, поскольку параметр requestValues ​​имеет значение null

POST http://localhost:51657/api/search HTTP/1.1
User-Agent: Fiddler
Content-Type: application/xml; charset=utf-8
Accept: application/xml
Host: localhost:51657
Content-Length: 213


  
  
  
    
      ClientName
      Client One
    
    
      ClientName
      Client Two
    
  

-. 121 ---757390-

Отправка 2D-массива в ядро ​​​​CudaУ меня возникли проблемы с пониманием того, как отправить 2D-массив в Cuda. У меня есть программа, которая анализирует большой файл с 30 точками данных в каждой строке. Читаю за раз около 10 строк и тут...

У меня возникли проблемы с пониманием того, как отправить 2D-массив в Cuda. У меня есть программа, которая анализирует большой файл с 30 точками данных в каждой строке. Я читаю около 10 строк за раз, а затем создаю матрицу для каждой строки и элементов (, поэтому в моем примере из 10 строк с 30 точками данных это будет int list[10][30];Моя цель — отправить этот массив моему ядру и пусть каждый блок обрабатывает строку (Я добился того, чтобы это отлично работало в обычном C, но Cuda был немного сложнее ).

Вот что я делаю до сих пор, но безуспешно (примечание :sizeofbucket = rows,и sizeOfBucketsHoldings = элементы в строке... Я знаю, что должен получить награду за странные имена переменных):

    int list[sizeOfBuckets][sizeOfBucketsHoldings]; //this is created at the start of the file and I can confirmed its filled with the correct data
#define sizeOfBuckets 10 //size of buckets before sending to process list
#define sizeOfBucketsHoldings  30
    //Cuda part
                //define device variables
                int *dev_current_list[sizeOfBuckets][sizeOfBucketsHoldings];
                //time to malloc the 2D array on device
                size_t pitch;
                cudaMallocPitch((int**)&dev_current_list,  (size_t *)&pitch, sizeOfBucketsHoldings * sizeof(int), sizeOfBuckets);

                //copy data from host to device
                cudaMemcpy2D( dev_current_list, pitch, list, sizeOfBuckets * sizeof(int), sizeOfBuckets * sizeof(int), sizeOfBucketsHoldings * sizeof(int),cudaMemcpyHostToDevice );

                process_list<<>> (sizeOfBuckets, sizeOfBucketsHoldings, dev_current_list, pitch);
                //free memory of device
                cudaFree( dev_current_list );


    __global__ void process_list(int sizeOfBuckets, int sizeOfBucketsHoldings, int *current_list, int pitch) {
        int tid = blockIdx.x;
        for (int r = 0; r < sizeOfBuckets; ++r) {
            int* row = (int*)((char*)current_list + r * pitch);
            for (int c = 0; c < sizeOfBucketsHoldings; ++c) {
                 int element = row[c];
            }
        }

Я получаю ошибку:

main.cu(266): error: argument of type "int *(*)[30]" is incompatible with parameter of type "int *"
1 error detected in the compilation of "/tmp/tmpxft_00003f32_00000000-4_main.cpp1.ii".

строка 266 - это вызов ядра process_list<<>> (count, countListItem, dev_current_list, pitch);. Я думаю, проблема в том, что я пытаюсь создать свой массив в своей функции как int *, но как еще я могу его создать? В моем чистом коде C я использую int current_list[num_of_rows][num_items_in_row], который работает, но я не могу добиться того же результата для работы в Cuda.

Моя конечная цель проста: я просто хочу, чтобы каждый блок обрабатывал каждую строку (sizeOfBuckets ), а затем перебирал все элементы в этой строке (sizeOfBucketHoldings ). Сначала я просто сделал обычный cudamalloc и cudaMemcpy, но это не сработало, поэтому я осмотрелся и узнал о MallocPitch и 2dcopy (, которых не было в моей cuda by exampleкниге ), и я пытался изучить примеры, но они, кажется, дают мне ту же ошибку (В настоящее время я читаю руководство по программированию CUDA _C, нашел эту идею на странице 22, но все равно не повезло ). Любые идеи? или подскажите куда смотреть?

Изменить :Чтобы проверить это, я просто хочу сложить значение каждой строки вместе (Я скопировал логику из cuda на примере примера добавления массива ). Мое ядро ​​:

__global__ void process_list(int sizeOfBuckets, int sizeOfBucketsHoldings, int *current_list, size_t pitch, int *total) {
    //TODO: we need to flip the list as well
    int tid = blockIdx.x;
    for (int c = 0; c < sizeOfBucketsHoldings; ++c) {
        total[tid] = total + current_list[tid][c];
    }
}

Вот как я объявляю общий массив в моем основном:

int *dev_total;
cudaMalloc( (void**)&dev_total, sizeOfBuckets * sizeof(int) );

5
задан Lostsoul 22 June 2012 в 14:11
поделиться