Mik*_*lly 7 c# asp.net-mvc-4 asp.net-web-api
核心问题:GET工作,POST没有.我是WebAPI的新手,所以我可能做了一些愚蠢的事情,但是我在网上试图弄清楚为什么这不起作用.
相当简单的WebAPI C#app.我试图将其归结为非常简单的路线:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
// Add a route where action is supplied, i.e. api/csv/LoadToSQL
config.Routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}"
);
Run Code Online (Sandbox Code Playgroud)
控制器类:
public class CsvController : ApiController
{
// GET api/csv
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/csv/name
public string Get(string csvName)
{
return "value";
}
// POST - api/csv/LoadToSQL
// Load a CSV to SQL
[HttpPost]
[ActionName("LoadToSQL")]
public HttpResponseMessage LoadToSQL(
string storageAccount,
string accessKey,
string containerName,
string csvFileName,
string connectionString,
string targetDatabaseName,
string targetTableName)
{
try
{
// Retrieve storage account from connection string.
CloudStorageAccount blobStorage = CloudStorageAccount.Parse(storageAccount);
Run Code Online (Sandbox Code Playgroud)
在本地启动并连接Fiddler.试试GET; 作品:
尝试POST - 失败:
我原来的实施刚才
// POST - api/csv
// Load a CSV to SQL
public HttpResponseMessage Post(
Run Code Online (Sandbox Code Playgroud)
但这没用,所以我开始尝试添加特定的路线和动词装饰.
无论我做什么,它似乎都没有看到针对该控制器的POST动作.
有什么想法吗?
更新 - 以下每个答案,正确的工作路线是:
// Add a route where action is supplied, i.e. api/csv/LoadToSQL
config.Routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{storageAccount}/{accessKey}/{containerName}/{csvFileName}/{connectionString}/{targetDatabaseName}/{targetTableName}"
);
Run Code Online (Sandbox Code Playgroud)
这显示了POST请求的所有参数.
如果您愿意,您可以替换您的方法以使其更加清晰和干净
1-用你的选项声明一个类
public class LoadToSqlData
{
public string storageAccount {get; set;}
public string accessKey {get; set;}
public string containerName {get; set;}
public string csvFileName {get; set;}
public string connectionString {get; set;}
public string targetDatabaseName {get; set;}
public string targetTableName {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
2-声明你的方法是:
[HttpPost]
[ActionName("ActionApi")]
[Route("api/Csv/LoadToSQL")]
public HttpResponseMessage LoadToSQL([FromBody]LoadToSqlData data)
Run Code Online (Sandbox Code Playgroud)
[Route],[ActionName]
注意和属性的用法[FromBody]
。
希望有帮助。