asp.net 发布 webAPI 到服务器,输入调用api后却找不到资源,输入根网址却打开文件目录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了asp.net 发布 webAPI 到服务器,输入调用api后却找不到资源,输入根网址却打开文件目录相关的知识,希望对你有一定的参考价值。

问题比较棘手,在线等。

应该是你的IIS配置问题,可能是没有启用asp.net。追问

嗯,也算是一方面吧,我排查了很多次,就是框架太低的缘故。
然后服务器特别老,只有.net 3.5框架。
我已经无力吐槽,现在只能降版本。可是3.5的API好像需要MVC2.0,这个需要安装vs2010,现在也没啥人用了。我连个教程都找不来

参考技术A 服务器没有配置好追问

可以请教一下么:windows sever 2003 r2 服务器安装不了.net 4.0,网上很多教程都试了。而且另一台08的服务器4.0框架却无法使用4.0框架编译的webAPI,你有什么好建议吗

追答

这个要实操摸索,不能泛泛而谈

本回答被提问者采纳

从 AngularJS 客户端发布到 ASP.NET WebApi 服务器

【中文标题】从 AngularJS 客户端发布到 ASP.NET WebApi 服务器【英文标题】:Posting to ASP.NET WebApi server from AngularJS client 【发布时间】:2016-04-17 05:42:16 【问题描述】:

我正在尝试将字符串从 AngularJS 应用程序(使用 $http)发布到基于 ASP.NET WebApi 构建的服务器,但我一添加参数就得到 404。

客户端代码是这样的

$scope.add = function () 
    // ...cut...
    $http( method: "POST", url: url, data:  fileString: "test string" ).then(
        function successCallback(response) 
            $log.info(response.data);
        
    );

服务器代码是

[HttpPost]
public IHttpActionResult UploadExcel(string fileString) 
    // cut

我得到一个 404,但是如果我删除服务器端的参数它可以工作,所以我可以使用这样的服务器端代码

[HttpPost]
public IHttpActionResult UploadExcel() 
    // cut

怎么了?我应该以不同的方式传递数据吗?我尝试了不同的组合,但我无法让它发挥作用。

【问题讨论】:

【参考方案1】:

您要做的是发送一个字符串,而不是像您现在使用 fileString: "test string" 所做的 JSON 对象。当我想发送一个字符串时,我通常会像这样从 Angular 发送数据:

$http.post("/Search/QuickSearch?searchQuery="+ searchString);

我的控制器准备好接收这样的字符串:

[HttpPost]
public IHttpActionResult QuickSearch(string searchQuery)

    // cut

如果我想发送一个 JSON 对象,我会告诉我的控制器它应该期待什么,就像这样:

[HttpPost]
public IHttpActionResult SaveActivity(ActivityEditForm form);

    // cut


public class ActivityEditForm

    public int? Id  get; set; 
    [Required]
    public string Title  get; set; 

    public string Description  get; set; 

然后像这样从 Angular 发送我的 JSON:

$http.post("/Activity/SaveActivity",  form: activity );

【讨论】:

这个变通方法不起作用,因为我的参数字符串太大 尝试将其作为 JSON 对象发送,然后为控制器准备数据。用我如何处理这种方法更新了我的答案。 由于某些配置相关的故障,我建议始终使用您的“JSON 对象”解决方案。即使是单个字符串,我也决定创建一个 C# 对象。 很遗憾听到您的解决方案存在一些问题,但我很高兴能为您提供帮助。我自己对我自己的解决方案相当满意,如果在过去两年里对我有很好的帮助:)【参考方案2】:

我建议你应该捕获 Angular 发送的请求。默认情况下,Angular 在请求正文中以 json 字符串形式发送参数。

我不确定 Asp.net 是否可以从正文中的 json 字符串解析它们。

所以,你可以尝试添加下面的代码(也需要jQuery)

angular.module('yourApp').config(function ($httpProvider) 
    $httpProvider.defaults.transformRequest = function(data)
        if (data === undefined) 
            return data;
        
        return $.param(data);
    
);

【讨论】:

感谢您的建议,我认为更改 C# WebApi 后端更加清晰,但如果有人无法控制后端,这应该是一个可行的解决方案【参考方案3】:

第一个错误在控制器中,[FromBody]应该和输入参数一起使用。

public IHttpActionResult UploadExcel([FromBody]string fileString)

那么客户端上的data变量应该是单个字符串,所以

$http( method: "POST", url: url, data: "test string" ).then(

反正我后来发现这个解决方案有些问题,这似乎是最简单的,但我建议避免它。


最佳解决方案

感谢@Squazz 的回答和this SO answer 我强烈建议更改 webapi 控制器,客户端是正确的。只需引入一个类来处理单个字符串并适配输入参数

// new class with a single string
public class InputData 
    public string fileString  get; set; 


// new controller 
[HttpPost]
public IHttpActionResult UploadExcel([FromBody] InputData myInput) 
    string fileString = myInput.fileString;
    // cut

这样来自客户端的 JSON 代码会被自动解析,并且很容易更改数据输入。

额外提示

$scope.add 角度函数在问题中是正确的,但这里有一个更完整的示例

$scope.testDelete = function () 
    var url = "http://localhost/yourAppLink/yourControllerName/UploadExcel";
    var data = ( fileString: "yourStringHere" );
    $http( method: "POST", url: url, data: data ).then(
        function successCallback(response) 
            console.log("done, here is the answer: ", response.data);
        , function errorCallback(response) 
            console.log("an error occurred");
        
    );

【讨论】:

以上是关于asp.net 发布 webAPI 到服务器,输入调用api后却找不到资源,输入根网址却打开文件目录的主要内容,如果未能解决你的问题,请参考以下文章

将Asp.Net WebAPI从AngularJS App的Asp.Net MVC站点移动到一个单独的站点

ASP.NET WebAPI 和 IIS 中的请求时间不一致

选择 webApi 模板时如何将 ASP.Net 身份添加到 Asp.Net Core?

在 .NET 4.5.1 中发布到 ASP.NET WebApi 2

在 asp.net WebAPI 中返回数组对象

C# 发布到 asp.net webapi Apiexception“响应的 HTTP 状态代码未排除 (201)。”