2015-08-21 4 views
0

По какой-то причине моя служба wcf не получает данные из моего POST правильно.WCF, принимающий пустой int

Это дает мне эту ошибку:

The server encountered an error processing the request. The exception message is 'There was an error deserializing the object of type System.Int32. The value '' cannot be parsed as the type 'Int32'.'

Аякса запрос выглядит следующим образом:

$.ajax({ 
     method: "POST", 
     contentType: "application/json", 
     url: "ShopService.svc/Product", 
     async: false, 
     data: JSON.stringify({ id: 1 }), 
     success: function (data) { 
      returndata = data; 
     }, 
     error: function (jqXHR, status, error) { 
      alert(error); 
     } 
    }); 

И сервис-код выглядит так:

[OperationContract] 
    [WebInvoke(UriTemplate = "/Product", Method = "POST", ResponseFormat = WebMessageFormat.Json)] 
    public Product GetProduct(int id) 
    { 
     Product selectedProduct = db.Products.Find(id); 

     return selectedProduct; 
    } 

Я не знаете, что здесь не так, почему сервер видит идентификатор как пустую строку?

+0

вы можете отправить образец данных для JSon объекта, который вы получите в службе? –

+0

@ Y.Ecarri Я ничего не получаю в сервисе, ошибка происходит до того, как я получу что-нибудь там. – Firenter

+0

Насколько я знаю, вы должны получить строки, а затем проанализировать строки, как показано здесь: http://www.codeproject.com/Articles/167159/How-to-create-a-JSON-WCF-RESTful-Service- in-sec –

ответ

0

Хорошо, ребята, я понял это после того, как занялся более сложными объектами.

Мне нужно установить атрибут BodyStyle моего WebInvoke в WrappedRequest, чтобы получить правильную десериализацию.

Так что теперь моя служебная функция выглядит следующим образом:

[OperationContract] 
    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, UriTemplate = "/Products", ResponseFormat = WebMessageFormat.Json)] 
    public Product GetProduct(string id) 
    { 
     int ID = Convert.ToInt32(id); 

     Product selectedProduct = db.Products.Find(ID); 

     return selectedProduct; 
    } 
0

вам нужно указать тип данных и типа как:

$.ajax({ 
     contentType: "application/json; charset=utf-8", 
     url: "ShopService.svc/Product", 
     data: JSON.stringify({ id: 1 }), 
      type: "POST", 
      dataType: "json", 
     success: function (data) { 
      returndata = data; 
     }, 
     error: function (jqXHR, status, error) { 
      alert(error); 
     } 
    }); 

Надеется, что это работает.

+0

Нет, не работает, такая же ошибка. – Firenter

0

Если вам просто нужно передать id, попробуйте передать его URL.

var id = 1; url: "ShopService.svc/Product/" + id;

+0

Это не работает, так как он меняет URL-адрес, который я сдал в шаблоне! Он не может найти функцию таким образом. – Firenter

+0

Попробуйте изменить 'UriTemplate' как:' [WebInvoke (UriTemplate = "/ Product/{id}", Method = "POST", ResponseFormat = WebMessageFormat.Json)] ' – sth

+0

Мне просто страшно, что когда я доберусь до более сложный материал, это тоже произойдет, но это работает сейчас. – Firenter

0

Попробуйте отправить целое число 1 непосредственно и удалить тип содержимого вместо отправки объекта JSON с поля идентификатор и значение 1, как вы служба ожидает целое число не является объектом

$.ajax({ 
     method: "POST", 
     url: "ShopService.svc/Product", 
     async: false, 
     data: 1, 
     success: function (data) { 
      returndata = data; 
     }, 
     error: function (jqXHR, status, error) { 
      alert(error); 
     } 
    }); 
+0

Это не работает, моя служба говорит, что id - 0 каждый раз. – Firenter

+0

@Firenter хорошо сначала это решило вашу проблему преобразования типов, которая является хорошей, теперь вы должны убедиться, что вы отправляете ненулевое значение. Если вы уверены, что он отличается от 0, попробуйте изменить тип параметра «id» с «int» на «object» в вашем методе обслуживания, а затем проверить значение. –