接收 xml json 或 form-urlencoded 中的任何数据的控制器操作
Controller action that receives any data in xml json or form-urlencoded
我需要创建一个控制器操作,它可以接受 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,我无法更改它。值得注意的是,这个网站api 是一个自托管的 api,它将 运行 在 windows 服务中。
我能够阅读 Request
而不是让 WebApi 弄清楚它:
[HttpPost]
public HttpResponseMessage Default()
{
try
{
NameValueCollection collection = Request.Content.IsFormData() ?
Request.Content.ReadAsFormDataAsync().Result :
GetCollection(Request.Content.ReadAsAsync<IDictionary<string, object>>().Result);
var parameters = ServiceAgentParameters.From(collection);
var agent = new ScriptingAgentClient();
var response = agent.Run(parameters);
if (response.Error)
return Request.CreateResponse(HttpStatusCode.BadRequest, new { ErrorMessage = response.ErrorMessage, Exception = response.Exception });
if (response.Data != null && response.Data.Count == 1) //result.Data is List<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 });
}
}
我需要创建一个控制器操作,它可以接受 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,我无法更改它。值得注意的是,这个网站api 是一个自托管的 api,它将 运行 在 windows 服务中。
我能够阅读 Request
而不是让 WebApi 弄清楚它:
[HttpPost]
public HttpResponseMessage Default()
{
try
{
NameValueCollection collection = Request.Content.IsFormData() ?
Request.Content.ReadAsFormDataAsync().Result :
GetCollection(Request.Content.ReadAsAsync<IDictionary<string, object>>().Result);
var parameters = ServiceAgentParameters.From(collection);
var agent = new ScriptingAgentClient();
var response = agent.Run(parameters);
if (response.Error)
return Request.CreateResponse(HttpStatusCode.BadRequest, new { ErrorMessage = response.ErrorMessage, Exception = response.Exception });
if (response.Data != null && response.Data.Count == 1) //result.Data is List<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 });
}
}