【问题标题】:Http client doesn't send a response or send a null - Angular and C# ApiHttp 客户端不发送响应或发送空值 - Angular 和 C# Api
【发布时间】:2018-08-30 11:55:32
【问题描述】:

我偶然发现了一个问题。我有一个 Angular 5 网站和一个基于 C# WebApi 的后端。

在我的网站中,我得到了一个组件,它可以向后端发送一个发布请求,将新实体添加到数据库中。不幸的是,它没有发送请求或在后端收到。

bet.component.ts

import {Injectable} from '@angular/core';
import {Service} from './service';
import {Http, Headers, RequestOptions, Response} from '@angular/http';
import {AppConfig} from '../app-config';
import {Bet} from '../models/bet';

@Injectable()
export class BetService extends Service {

  private url = this.config.apiUrl + '/bet';

  constructor(private http: Http, private config: AppConfig) {
    super();
  }

  addBet(bet: Bet) {
    return this.http.post(this.url + '/add', bet);
  }
}

BetController.cs

using System;
using System.Threading.Tasks;
using FakeBet.API.DTO;
using FakeBet.API.Services.Interfaces;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace FakeBet.API.Controllers
{
    [Route("api/[controller]")]
    public class BetController : Controller
    {
        private IBetService service;

        public BetController(IBetService service)
        {
            this.service = service;
        }

        [HttpPost("[action]")]
        public async Task<IActionResult> Add([FromBody] BetDTO bet) 
        {
            try
            {
                await service.AddBetAsync(bet);
                return Ok();
            }
            catch (Exception ex)
            {
                return BadRequest(ex.Message);
            }
        }
    }
}

网址没问题。

我尝试将 bet.component.ts 更改为

return this.http.post(this.url + '/add', bet).subscribe(x => console.log('test'));

然后在后端收到响应,但BetDto bet 为空。 而 bet 不为 null 并且 Angular 和 Api 中的对象中的属性名称相同。

我还尝试使用邮递员发送请求,并且进展顺利。这是它的外观。

谁能告诉我我的错误在哪里?干杯!

BetDTO

using System;
using FakeBet.API.Models;

namespace FakeBet.API.DTO
{
    public class BetDTO
    {
        public Guid BetId { get; set; }

        public string MatchId { get; set; }

        public string UserId { get; set; }

        public int BetOnTeamA { get; set; }

        public int BetOnTeamB { get; set; }
    }
}

bet.ts

export class Bet {
  matchId: string;
  userId: string;
  betOnTeamA: number;
  betOnTeamB: number;
}

【问题讨论】:

  • 请发布minimal reproducible example 不是随机的代码部分
  • 我在这里没有看到任何HttpClient。有一个 Angular 脚本调用 Web API 控制器,在正文中传递一个 JSON 字符串。如果该主体与 BetDTO 类不匹配,则该参数将为空。 BetDTO 看起来像什么?顺便说一句,动作方法被命名为Add,所以URL应该是/add,而不是addBet
  • 如果 POSTMAN 工作,则意味着 Angular 和 C# 对象相同或请求不同。使用 Fiddler 检查这两个请求的外观以及它们的不同之处。也许缺少内容类型标头? DTO 编码错误?
  • 内容类型标头是否设置在角度部分?
  • @LewisTaylor 标题没有问题。是默认设置的,我试过手动设置还是不行。

标签: c# angular rest asp.net-web-api2


【解决方案1】:

好的,我找到了解决方案,这是我从未想过的事情。 因此,当我在 webapi 上请求资源时,我正在传递一个字段等于 "betOnTeamA" = "" 或类似内容的请求。但显然,当一个字段是这样的时候,.net 认为整个响应都是空的。所以一个解决方案是简单地将"betOnTeamA" = "" 更改为"betOnTeamA" = "0",然后它就像一个魅力一样工作。

【讨论】:

  • 你说的是BetOnTeamA 吗?如果是这样,那是有道理的,您不能将"" 转换为int
  • @DanDumitru 是的,我的意思是它已修复。
猜你喜欢
  • 2017-08-11
  • 2015-11-29
  • 2015-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-31
相关资源
最近更新 更多