Que estoy recibiendo este error cuando intento publicar un poco de orden a través de la dirección URL de HTTP

El diccionario de parámetros contiene una entrada null para el parámetro ‘id’ de
no tipo que acepta valores null ‘del Sistema.Int32’ para el método
‘DatabaseService_WebAPI.Modelos.Producto GetProduct(Int32)’ en
‘DatabaseService_WebAPI.Los controladores.ProductController’. Opcional
el parámetro debe ser un tipo de referencia, un tipo que acepta valores null, o ser declarado como
un parámetro opcional.

puedo hacer que mi api controlador mediante el uso de un tutorial que está disponible en ASP.NET Web API.

Esta es mi URL

http://localhost:3325/api/Product/PostProduct?User=Haris2&ShopName=Dwatson&city=RYK&OrderDate=28/9/2012&OrderDetail=Strips

Producto.cs

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace DatabaseService_WebAPI.Models
{
    public class Product
    {
        [ScaffoldColumn(false)]
        public int Id { get; set; }
        [Required]
        public string User { get; set; }
        public string ShopName { get; set; }
        public string city { get; set; }
        public string OrderDate { get; set; }
        public string OrderDetail { get; set; }
    }
}

ProductController.cs

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;
using DatabaseService_WebAPI.Models;
namespace DatabaseService_WebAPI.Controllers
{
public class ProductController : ApiController
{
private ProductContext db = new ProductContext();
//GET api/Product
public IEnumerable<Product> GetProducts()
{
return db.Products.AsEnumerable();
}
//GET api/Product/5
public Product GetProduct(int id)
{
Product product = db.Products.Find(id);
if (product == null)
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
}
return product;
}
//PUT api/Product/5
public HttpResponseMessage PutProduct(int id, Product product)
{
if (ModelState.IsValid && id == product.Id)
{
db.Entry(product).State = EntityState.Modified;
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
return Request.CreateResponse(HttpStatusCode.NotFound);
}
return Request.CreateResponse(HttpStatusCode.OK);
}
else
{
return Request.CreateResponse(HttpStatusCode.BadRequest);
}
}
//POST api/Product
public HttpResponseMessage PostProduct(Product product)
{
if (ModelState.IsValid)
{
db.Products.Add(product);
db.SaveChanges();
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, product);
response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = product.Id }));
return response;
}
else
{
return Request.CreateResponse(HttpStatusCode.BadRequest);
}
}
//DELETE api/Product/5
public HttpResponseMessage DeleteProduct(int id)
{
Product product = db.Products.Find(id);
if (product == null)
{
return Request.CreateResponse(HttpStatusCode.NotFound);
}
db.Products.Remove(product);
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
return Request.CreateResponse(HttpStatusCode.NotFound);
}
return Request.CreateResponse(HttpStatusCode.OK, product);
}
protected override void Dispose(bool disposing)
{
db.Dispose();
base.Dispose(disposing);
}
}
}

RouteConfig.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Routing;
namespace DatabaseService_WebAPI
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
}

Global.asax

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using DatabaseService_WebAPI.App_Start;
namespace DatabaseService_WebAPI
{
//Note: For instructions on enabling IIS6 or IIS7 classic mode, 
//visit http://go.microsoft.com/?LinkId=9394801
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
System.Data.Entity.Database.SetInitializer(new DatabaseService_WebAPI.Models.ProductContextInitializer());
//WebApiConfig.Configure(GlobalConfiguration.Configuration);
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}

}

Es mi método de llamada que está mal o que tengo que hacer algo más para saltar id?

  • Hizo llamar a api/Producto/5 o api/Producto ? en el primer caso, luego de la identificación es, obviamente, null así que el error es correcta
  • pruebe a cambiar público Producto GetProduct(int id){} al público del Producto GetProduct(int? id){}
  • yove called api/Product/PostProduct @MMK Im no conseguir los productos. Estoy tratando de enviar los productos.
  • Mala esquema de url! Correcto sería api/Products y llamar a la URL mediante HTTP POST verbo.
  • Llamar a api/Producto/PostProduct sin /id=5 al final causaría id convertido en null
  • he probado con api/Producto, pero sin éxito.
  • eso es porque no estás de asignación de la dirección URL de la ruta. Usted necesita asignar a su controlador de api/products (tenga en cuenta que no hay parámetros de URL) y que necesita para configurar la acción de verbo POST.
  • u puede darme un ejemplo de código ¿cómo puedo mapa de mi POST Verbo?
  • tiene que ser una regla de enrutamiento que pueden distinguir entre un identificador de estar presente y no. Me sorprende el valor predeterminado webapi de enrutamiento no está preconfigurado para trabajar con la plantilla webapi (v2) de la clase que proporciona dos métodos Get: uno sin parámetros que devuelve una colección de objetos y el otro con un parámetro de id que devuelve un único objeto.

InformationsquelleAutor Haris | 2012-10-16

3 Comentarios

  1. 2

    Dos cosas:

    1. Necesita [FromUri] en el parámetro del Producto si desea pasar este tipo de complejo a partir de la Url:

      //POST api/Product
      public HttpResponseMessage PostProduct(Product product)
      {...}
    2. Necesita agregar un Http ruta que acepta el nombre de la acción en la Uri (desde su uri que siempre ha «PostProduct» en ella…)

          config.Routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "api/{controller}/{action}/{id}",
      defaults: new { id = RouteParameter.Optional }
      );
    • [FromUri] trabajo está bien. pero cuando agrego {acción} me da una mala respuesta a la solicitud. de todos modos thx por ur respuesta.
  2. 2

    Trate de añadir el siguiente atributo [FromUri] a su método POST:

        //POST api/Product
    public HttpResponseMessage PostProduct([FromUri]Product product)
    {

    Su dirección URL relativa debe ser

    http://localhost:xxxx/api/Product

    Esto debería permitir que usted fije su modelo usando esta URL:

    http://localhost:xxxx/api/Product?User=Haris2&ShopName=Dwatson&city=RYK&OrderDate=28/9/2012&OrderDetail=Strips

    También considerar el uso de un JSON [FromBody] carga en su lugar:

        //POST api/Product
    public HttpResponseMessage PostProduct([FromBody]Product product)
    {

    Con la petición como:

    User-Agent: Fiddler
    Host: localhost:55805
    Content-Length: 98
    Content-Type: application/json
    POST: http://localhost:xxxx/api/product
    BODY: {"User":"Haris2","ShopName":"Dwatson","city":"RYK","OrderDate":"28/9/2012","OrderDetail":"Strips"}
    • Thx mucho Mark Jones. Que es el trabajo perfecto.
  3. -3

    debe agregar método de formulario en el enlace de acción

     @Html.ActionLink("عرض التفاصيل", "JobDetails","Job",  new { id = item.UniqueId },***FormMethod.Get or post***)

Dejar respuesta

Please enter your comment!
Please enter your name here