我开始使用MVC4 Web API项目,我有多种HttpPost方法的控制器.控制器如下所示:
调节器
public class VTRoutingController : ApiController
{
[HttpPost]
public MyResult Route(MyRequestTemplate routingRequestTemplate)
{
return null;
}
[HttpPost]
public MyResult TSPRoute(MyRequestTemplate routingRequestTemplate)
{
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
这里MyRequestTemplate表示负责处理通过请求的Json的模板类.
错误:
当我让使用招为请求http://localhost:52370/api/VTRouting/TSPRoute或http://localhost:52370/api/VTRouting/Route 我得到一个错误:
找到了与请求匹配的多个操作
如果我删除上述方法之一,它工作正常.
Global.asax中
我已经尝试修改默认路由表global.asax,但我仍然收到错误,我认为我在global.asax中定义路由时遇到问题.这是我在global.asax中所做的.
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapHttpRoute(
name: "MyTSPRoute",
routeTemplate: "api/VTRouting/TSPRoute",
defaults: new { }
);
routes.MapHttpRoute(
name: "MyRoute",
routeTemplate: "api/VTRouting/Route",
defaults: new { action="Route" }
);
}
Run Code Online (Sandbox Code Playgroud)
我正在使用POST在Fiddler中发出请求,在RequestBody中为MyRequestTemplate传递json.
我在JavaScript中有以下复杂对象,其中包含过滤器选项
var filter={caseIdentifiter:'GFT1',userID:'2'};
Run Code Online (Sandbox Code Playgroud)
我想传递给ASP.NET MVC4 WebApi控制器GET
[HttpGet]
public IEnumerable<JHS.Repository.ViewModels.CaseList> Get([FromBody]Repository.InputModels.CaseListFilter filter)
{
try
{
return Case.List(filter);
}
catch (Exception exc)
{
//Handle exception here...
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
使用jQuery ajax调用
var request = $.ajax({
url: http://mydomain.com/case,
type: 'GET',
data: JSON.stringify(filter),
contentType: 'application/json; charset=utf-8',
cache: false,
dataType: 'json'
});
Run Code Online (Sandbox Code Playgroud)
ASP.NET控制器方法中的"filter"对象为"null".如果我将其更改为POST,则正确传递过滤器对象.有没有办法将复杂的对象传递给GET?
我不想将参数分离到URL,因为会有一些参数会使它效率低下,很难有可选参数,这样即使添加了新参数,方法签名也保持不变.
我正在尝试将一些JSON发布到外部API,因为我的内容被分块,所以它会一直失败.有人可以告诉我如何禁用它吗?
我正在使用ASP.NET 5,所以我认为我正在使用System.Net.Http,Version = 4.0.1.0
这是我尝试过的代码:
using (var client = new HttpClient())
{
// TODO - Send HTTP requests
client.BaseAddress = new Uri(apiBaseUrl);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("SAML", samlToken);
client.DefaultRequestHeaders.TransferEncodingChunked = false;
HttpResponseMessage response = await client.PostAsJsonAsync(path, jsonObject);
}
Run Code Online (Sandbox Code Playgroud)
但是当我检查Fiddler时,似乎仍然将Transfer-Encoding设置为"chunked".
有人能帮忙吗?
我有一个枚举:
public enum FilterOperator
{
[EnumMember(Value = "eq")]
Equals,
[EnumMember(Value = "gt")]
GreaterThan,
[EnumMember(Value = "lt")]
LessThan,
[EnumMember(Value = "in")]
In,
[EnumMember(Value = "like")]
Like
}
Run Code Online (Sandbox Code Playgroud)
以及包含枚举属性的类:
public class GridFilter
{
[JsonProperty("operator")]
[JsonConverter(typeof(StringEnumConverter))]
public FilterOperator Operator { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
该对象通过WebAPI操作传入,并按预期对“ like”和“ in”进行反序列化,但不适用于“ lg”或“ gt”。知道为什么吗?
更新:好吧,“喜欢”和“从事”工作的原因是它们与枚举名称匹配。将GreaterThan重命名为Gt(etc)是可行的。因此,真正的问题是为什么不使用StringEnumConverter?
c# ×3
.net-core ×1
ajax ×1
asp.net ×1
asp.net-core ×1
enums ×1
global-asax ×1
http-get ×1
json ×1
json.net ×1