Angolare POST di Web API non passare i dati

Ho scritto il codice contro ASP.NET Web API per un po ‘ ora con jQuery e sto iniziando qualcosa di nuovo, Angolare (scrittura contro la stessa API Web back-end.)

Sto Postando un metodo che restituisce alcuni risultati della ricerca per un’entità nel sistema. Assomiglia a questo:

public IEnumerable<dynamic> Post(string entity, FormDataCollection parameters)
{
    //entity is passed on the route.
    //parameters contains all the stuff I'm trying to get here.
}

Se chiamo il metodo di utilizzo di jQuery.post di:

$.post('api/search/child', {where : 'ParentID = 1'}, function(d){ foo = d });

funziona solo a destra e restituisce ciò che mi sarei aspettato.

Ho fatto un servizio nel mio angolare applicazione che fa una chiamata simile:

$http.post('api/search/child', { where: 'parentID = ' + parent.ID })
.success(function (data, status, headers, config) {
    //etc.
})

Ma quando si colpisce il mio metodo “Post” sul server “parametri” è null.

Dopo alcune ricerche con google ho cercato di aggiungere un’intestazione content-type per garantire passati come JSON, e cercando di JSON.stringify-ing e $.param()-ing “data” argomento, ma che non ha fatto nulla (e da quello che ho letto che non dovrebbe essere necessario). Che cosa sto facendo di sbagliato? Grazie per il vostro aiuto!

AGGIORNAMENTO:
Ecco le materie prime di richiesta (di lavoro) di jQuery esempio:

POST http://localhost:51383/api/search/child HTTP/1.1
Accept: */*
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: http://localhost:51383/mypage.aspx
Accept-Language: en-US
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
Host: localhost:51383
Content-Length: 23
DNT: 1
Connection: Keep-Alive
Pragma: no-cache
Cookie: (etc)
Authorization: (etc)

where=ParentID+%3D+1

E crudo richiesta dalla (mancata) Angolare di esempio:

POST http://localhost:51383/api/search/parent HTTP/1.1
Content-Type: application/json;charset=utf-8
Accept: application/json, text/plain, */*
Referer: http://localhost:51383/mypage.aspx
Accept-Language: en-US
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
Connection: Keep-Alive
Content-Length: 27
DNT: 1
Host: localhost:51383
Pragma: no-cache
Cookie: (etc)

{"where":"ScorecardID = 1"}

Molto strano. Anche quando ho aggiunto la ‘json’ il tipo di dati del parametro al fine di jQuery chiamata, comunque crea www-form-urlencoded richiesta. E che è l’unica che funziona. La mia applicazione dell’API Web è già impostato per il JSON (ma grazie Dalorzo).

OriginaleL’autore James Orr | 2014-05-29

3 Replies
  1. 3

    Controllare se è stato inserito anche il JSON Formatter nella configurazione. Dovrebbe essere qualcosa come :

        System.Web.Http.GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
        config.Formatters.Insert(0, new System.Net.Http.Formatting.JsonMediaTypeFormatter());

    Il Content-Type=application/json solo funzionare se si imposta il corretto formatter.

    Si può anche provare a utilizzare [FromBody] accanto al tuo tipo di parametro.

    OriginaleL’autore

  2. 2

    Ho risolto il problema di seguito i codici:

    Lato Client:

         $http({
                    url: me.serverPath,
                    method: 'POST',
                    data: data,
                    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
                }).
                    success(function (serverData) {
                        console.log("ServerData:", serverData);
        ......

    Notare che i dati di un oggetto.

    Sul server (ASP.NET MVC):

    [AllowCrossSiteJson]
            public string Api()
            {
                var data = JsonConvert.DeserializeObject<AgentRequest>(Request.Form[0]);
                if (data == null) return "Null Request";
                var bl = Page.Bl = new Core(this);
    
                return data.methodName;
            }

    e ‘AllowCrossSiteJsonAttribute’ è necessario per la croce richieste di dominio:

    public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
        {
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
                base.OnActionExecuting(filterContext);
            }
        }

    OriginaleL’autore

Lascia un commento