2021-11-13, 18:17
  #1
Medlem
Hej jag försöker fixa så att jag kan konsumera ett webb api i enighet med https://www.c-sharpcorner.com/article/consuming-asp-net-web-api-rest-service-in-asp-net-mvc-using-http-client/

När jag sedan försöker köra koden så får jag
An unhandled exception occurred while processing the request.
ArgumentNullException: Value cannot be null. (Parameter 'value')
koden i kontrollen är:
Kod:
 string Baseurl = "https://localhost:44388/";

        public List<Personal> PersInfo { get; private set; }
        public string PersResponse { get; private set; }

        public async Task<IActionResult> Index()
        {
            List<Personal> Anstallda = new List<Personal>();
            using (var client = new HttpClient())
            {
                ///Hantera Url
                client.BaseAddress = new Uri(Baseurl);
                client.DefaultRequestHeaders.Clear();

                ///Hantera hur request hanteras
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                HttpResponseMessage Res = await client.GetAsync("api/Personal/GetAllStaff");

                if (Res.IsSuccessStatusCode)
                {
                    var PersResponse = Res.Content.ReadAsStringAsync().Result;
                }

            }

            PersInfo = JsonConvert.DeserializeObject<List<Personal>>(PersResponse);

            return View(PersInfo);
        }
"

det finns data i databasen så det känns som att det är någon ytterligare koppling jag har missat men trots flera försök kan jag inte riktigt hitta det.
Citera
2021-11-13, 19:05
  #2
Medlem
Är du säker på att API'et svarar så som du förväntar dig, på den URL du går mot? Ditt exempel går mot "api/Personal/GetAllStaff", medan exemplet i guiden du länkade till går mot "api/Employee/GetAllEmployees".

Prova att skriva ut den kompletta adressen som GET-anropet går mot (dvs printa till konsolen), och testa att klistra in den i browsern och se vad som händer. För det verkar inte vara någon inloggning eller liknande, så det borde gå att se svaret direkt i browsern.

Hur såg felmeddelandet ut, mer exakt? Kom det inte någon stacktrace?

Och vad jag kan se så ignorerar du eventuella fel som inte ger exception. Om Res.IsSuccessStatusCode är false så borde du inte gå vidare med DeserializeObject... Kanske är det den som smäller om den får in ett null-värde?

Om allt ser bra ut när du gör browser-testet ovan, och du inte kommer vidare med det andra jag skrivit, kolla då upp vad det finns för debug-möjligheter i HttpClient. Du bör kunna få den att spotta ur sig all metadata om både request och response.
Citera
2021-11-13, 19:09
  #3
Medlem
Ah, nu tror jag att jag vet vad felet är! Du definierar PersResponse på två ställen! Nu är inte detta ett språk jag jobbar med, men såvitt jag kan se så kastar du bort datat i det "innre" (dvs det andra) PersResponse-objektet så fort if-satsen är avslutad.

Ta bort "var" på denna rad:
Kod:
var PersResponse = Res.Content.ReadAsStringAsync().Result;

Då kommer du använda objektet du definierade i början av filen.
Citera
2021-11-13, 21:04
  #4
Medlem
Protons avatar
Citat:
Ursprungligen postat av Nullheap
Hej jag försöker fixa så att jag kan konsumera ett webb api i enighet med https://www.c-sharpcorner.com/article/consuming-asp-net-web-api-rest-service-in-asp-net-mvc-using-http-client/

När jag sedan försöker köra koden så får jag
An unhandled exception occurred while processing the request.
ArgumentNullException: Value cannot be null. (Parameter 'value')
koden i kontrollen är:
Kod:
 string Baseurl = "https://localhost:44388/";

        public List<Personal> PersInfo { get; private set; }
        public string PersResponse { get; private set; }

        public async Task<IActionResult> Index()
        {
            List<Personal> Anstallda = new List<Personal>();
            using (var client = new HttpClient())
            {
                ///Hantera Url
                client.BaseAddress = new Uri(Baseurl);
                client.DefaultRequestHeaders.Clear();

                ///Hantera hur request hanteras
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                HttpResponseMessage Res = await client.GetAsync("api/Personal/GetAllStaff");

                if (Res.IsSuccessStatusCode)
                {
                    var PersResponse = Res.Content.ReadAsStringAsync().Result;
                }

            }

            PersInfo = JsonConvert.DeserializeObject<List<Personal>>(PersResponse);

            return View(PersInfo);
        }
"

det finns data i databasen så det känns som att det är någon ytterligare koppling jag har missat men trots flera försök kan jag inte riktigt hitta det.

Citat:
Ursprungligen postat av standardpapper
Ah, nu tror jag att jag vet vad felet är! Du definierar PersResponse på två ställen! Nu är inte detta ett språk jag jobbar med, men såvitt jag kan se så kastar du bort datat i det "innre" (dvs det andra) PersResponse-objektet så fort if-satsen är avslutad.

Ta bort "var" på denna rad:
Kod:
var PersResponse = Res.Content.ReadAsStringAsync().Result;

Då kommer du använda objektet du definierade i början av filen.
Alldeles riktigt,
Kod:
if (Res.IsSuccessStatusCode)
                {
                    var PersResponse = Res.Content.ReadAsStringAsync().Result;
                }
kommer göra variabeln PersResponse lokal i if-blocket, men sen försöker du deserialisera PersResponse som du deklarerade i början av din kod och den kommer såklart vara null i det läget.

Har du inte provat debuggern i visual studio? Om inte är det ett bra tillfälle att börja nu.
Citera
2022-01-07, 18:43
  #5
Medlem
Citat:
Ursprungligen postat av Proton
Alldeles riktigt,
Kod:
if (Res.IsSuccessStatusCode)
                {
                    var PersResponse = Res.Content.ReadAsStringAsync().Result;
                }
kommer göra variabeln PersResponse lokal i if-blocket, men sen försöker du deserialisera PersResponse som du deklarerade i början av din kod och den kommer såklart vara null i det läget.

Har du inte provat debuggern i visual studio? Om inte är det ett bra tillfälle att börja nu.

Normalt sätt men lyckades inte tolka felmeddelandet riktigt i detta fall.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in