Maverick HT
Maverick HT

Reputation: 547

HttpClient.PostAsJsonAsync not working or giving any errors in debug mode

I’m having some problems using the Web API with the MVC, not sure what is causing it but it doesn’t throw any exceptions or errors in debug mode, please could someone help to resolve this issue.

Code is as follows:

MVC Controller calls:

PortalLogonCheckParams credParams = new PortalLogonCheckParams() {SecurityLogonLogonId = model.UserName, SecurityLogonPassword = model.Password};

SecurityLogon secureLogon = new SecurityLogon();

var result = secureLogon.checkCredentials(credParams);

Data Access Object method:

public async Task <IEnumerable<PortalLogon>> checkCredentials(PortalLogonCheckParams credParams)
{
    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri("http://localhost:50793/");
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        // Check Credentials

        //Following call fails

        HttpResponseMessage response = await client.PostAsJsonAsync("api/chkPortalLogin", credParams);  


        if (response.IsSuccessStatusCode)
        {
            IEnumerable<PortalLogon> logonList = await response.Content.ReadAsAsync<IEnumerable<PortalLogon>>();
            return logonList;
        }
        else return null;
    }

}

Web API:

[HttpPost]
public IHttpActionResult chkPortalLogin([FromBody] PortalLogonCheckParams LogonParams)
{

    List<Mod_chkPortalSecurityLogon> securityLogon = null;

    String strDBName = "";

    //Set the database identifier        
    strDBName = "Mod";

    //Retrieve the Logon object
    using (DataConnection connection = new DataConnection(strDBName))
    {
        //Retrieve the list object
        securityLogon = new Persistant_Mod_chkPortalSecurityLogon().findBy_Search(connection.Connection, LogonParams.SecurityLogonLogonId, LogonParams.SecurityLogonPassword);
    }

    AutoMapper.Mapper.CreateMap<Mod_chkPortalSecurityLogon, PortalLogon>();

    IEnumerable<PortalLogon> securityLogonNew = AutoMapper.Mapper.Map<IEnumerable<Mod_chkPortalSecurityLogon>, IEnumerable<PortalLogon>>(securityLogon);


    return Ok(securityLogonNew);

}

Upvotes: 2

Views: 11110

Answers (1)

Nkosi
Nkosi

Reputation: 247641

You need to remove the [FromBody] attribute from the parameter

Using [FromBody]

To force Web API to read a simple type from the request body, add the [FromBody] attribute to the parameter:

public HttpResponseMessage Post([FromBody] string name) { ... }

In this example, Web API will use a media-type formatter to read the value of name from the request body. Here is an example client request.

POST http://localhost:5076/api/values HTTP/1.1
User-Agent: Fiddler
Host: localhost:5076
Content-Type: application/json
Content-Length: 7

"Alice"

When a parameter has [FromBody], Web API uses the Content-Type header to select a formatter. In this example, the content type is "application/json" and the request body is a raw JSON string (not a JSON object).

At most one parameter is allowed to read from the message body.

Upvotes: 2

Related Questions