.Net WebAPI Post 方法在 Angular2 服务中不起作用

Posted

技术标签:

【中文标题】.Net WebAPI Post 方法在 Angular2 服务中不起作用【英文标题】:.Net WebAPI Post method is not working from Angular2 service 【发布时间】:2018-04-28 03:52:33 【问题描述】:

我是 Angular 2 的新手。我正在将表单数据从 Angular 2 发送到 webapi,但它不起作用。 WebAPI:

public class FetchDataController : ApiController
    

        [HttpGet]
        public IList<Student> ListOfStudents()
        
            AppRepository objapp = new AppRepository();
            IList<Student> objData = null;
            objData = objapp.getStudent();
            return objData;
        

        [HttpPost]
        [Route("PostStudent")]
        public JsonResult<Boolean> PostStudent(Student value)
        
            // Append text to an existing file named "WriteLines.txt".
            string data = "ID: " + value.Id + ", FirstName: " + value.FirstName + ",LastName: " + value.LastName + ",Salary: " + value.salary;
            using (StreamWriter outputFile = new StreamWriter(HttpContext.Current.Server.MapPath("~")+ "/TestVD/WriteLines.txt", true))
            
                outputFile.WriteLine(data);
            
            return Json(true);
        

    

我的 WebAPIConfig.js 如下。我在这里添加了 CORS 处理以及 Webconfig 文件:

var cors = new EnableCorsAttribute("http://localhost", "*", "*");
              config.EnableCors(cors);

            // Web API configuration and services
            config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));
            // Web API routes
            config.MapHttpAttributeRoutes();
            config.Routes.MapHttpRoute(
            name: "ListOfStudents",
            routeTemplate: "api/controller/id",
            defaults: new  controller = "FetchData", action = "ListOfStudents", id = RouteParameter.Optional 
            );

            config.Routes.MapHttpRoute(
               name: "PostStudent",
               routeTemplate: "api/controller/id",
               defaults: new  controller = "FetchData", action = "PostStudent", id = RouteParameter.Optional 
            );
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/controller/id",
                defaults: new  id = RouteParameter.Optional 
            );

现在,从 Angular 2 开始,我可以使用学生 webAPI 方法列表显示数据,但是在发布时,我从我的 WEBAPI url 得到“405(不允许的方法)”。 我在 WEBAPI post 方法的响应下感到困惑。

ok
:
false
status
:
405
statusText
:
"Method Not Allowed"
type
:
2
url
:
"http://localhost/TestWebService/api/FetchData/"
_body
:
""Message":"The requested resource does not support http method 'POST'.""

我的Angular 2服务代码如下

@Injectable()
export class RssService 
private studentUrl = "http://localhost/TestWebService/api/FetchData/";
    constructor(private http: Http)    
    getStudentList() 
        return this.http.get(this.studentUrl)
            .map(res => <Student[]>res.json())
            .catch(this.handleError);
    
    private handleError(error: Response) 
        console.error(error);
        return Observable.throw(error.json().error || 'Server error');
    
    postStudent(model: any): Observable<any> 
        let body = JSON.stringify(model);
        let headers = new Headers( 'Content-Type': 'application/json' );
        let options = new RequestOptions( headers: headers );
        console.log('add Student start : ' + body);
        return this.http.post(this.studentUrl , body, options)
            .map((response: Response) => <any>response.json())
            .catch(this.handleError);
    

你能帮帮我吗...

【问题讨论】:

【参考方案1】:

您的 PostStudent 方法上有一个路由属性 [Route("PostStudent")]

因此,此操作的 URL 不是http://localhost/TestWebService/api/FetchData/,而是http://localhost/TestWebService/PostStudent

要使用 URL http://localhost/TestWebService/api/FetchData/,只需删除此 Route 属性即可。

如果您仍想对PostStudent 操作使用特定路由并通过http://localhost/TestWebService/api/FetchData/PostStudent 访问它,请在控制器上添加RoutePrefix 属性:

[RoutePrefix("api/FetchData")]
public class FetchDataController : ApiController

查看本文了解模式详情:Attribute Routing in ASP.NET Web API 2

【讨论】:

【参考方案2】:

由于 System.Net 和 System.Web 命名空间,我已经解决了它。这个link对我帮助很大。

【讨论】:

以上是关于.Net WebAPI Post 方法在 Angular2 服务中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

.net core 3.1 webapi解决跨域问题 GET DELETE POST PUT等

如何在 POST 正文中为 asp.net WebAPI POST 路由格式化 XML

ASP.NET WebApi 从入门到"放弃"系列---WebApi 请求路由

csharp ASP.NET WebApi Post File操作

模型绑定不适用于 ASP.NET Core 2 WebAPI 中的 POST 请求

HTTP post请求中的多个参数不在Asp.net webApi 2.0中绑定