asp.net 发布 webAPI 到服务器,输入调用api后却找不到资源,输入根网址却打开文件目录
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了asp.net 发布 webAPI 到服务器,输入调用api后却找不到资源,输入根网址却打开文件目录相关的知识,希望对你有一定的参考价值。
问题比较棘手,在线等。
应该是你的IIS配置问题,可能是没有启用asp.net。追问嗯,也算是一方面吧,我排查了很多次,就是框架太低的缘故。
然后服务器特别老,只有.net 3.5框架。
我已经无力吐槽,现在只能降版本。可是3.5的API好像需要MVC2.0,这个需要安装vs2010,现在也没啥人用了。我连个教程都找不来
可以请教一下么: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?