我需要创建一个控制器操作,它可以接受XML,JSON或form-urlencoded中的任何数据。但是,我无法使其发挥作用。
如果我的操作有Dictionary<string, object>
参数,则它适用于JSON和XML数据,但不适用于form-urlencoded。如果我的操作有FormDataCollection
参数,则它适用于form-urlencoded但不适用于JSON和XML。
[HttpPost]
public HttpResponseMessage Default(FormDataCollection data /*Dictionary<string,object> data*/)
{
try
{
if (data == null)
return Request.CreateResponse(HttpStatusCode.BadRequest, new { ErrorMessage = "The request body is empty" });
//var collection = GetCollection(data); //used when data=Dictionary<string,object>
var collection = data.ReadAsNameValueCollection();
var agent = new ScriptingAgentClient();
var parameters = ServiceAgentParameters.From(collection);
var result = agent.Run(parameters);
if (result.Error)
return Request.CreateResponse(HttpStatusCode.BadRequest, new { ErrorMessage = result.ErrorMessage, Exception = result.Exception });
if (result.Data != null && result.Data.Count == 1) //result.Data is byte[]
{
//TODO: use the right Serializer
var resultString = Encoding.UTF8.GetString(result.Data[0]);
var serializer = new JavaScriptSerializer();
var dict = serializer.Deserialize<Dictionary<string, string>>(resultString);
return Request.CreateResponse(HttpStatusCode.OK, dict);
}
return Request.CreateResponse(HttpStatusCode.BadRequest, new { ErrorMessage = "Unknown error" });
}
catch (Exception ex)
{
Logger.Error("Error handling request", ex);
return Request.CreateResponse(HttpStatusCode.BadRequest, new { ErrorMessage = ex.Unwrap().Message });
}
}
ScriptingAgentClient
将处理数据,无论它是什么。
如果这是不可能的,我怎样才能创建两个具有相同路由的动作,其中一个将处理XML / JSON而另一个将处理form-urlencoded?
请注意,我使用 .net40 ,我无法改变这种情况。值得一提的是,这个webapi是一个自托管的api,可以在windows服务中运行。
答案 0 :(得分:0)
我能够让它工作阅读 .slz-list-block.slz-column-2
{
display: table-column;
}
,而不是让WebApi搞清楚:
Request