在xml json或form-urlencoded

时间:2017-11-10 19:52:59

标签: c# asp.net-web-api .net-4.0

我需要创建一个控制器操作,它可以接受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服务中运行。

1 个答案:

答案 0 :(得分:0)

我能够让它工作阅读 .slz-list-block.slz-column-2 { display: table-column; } ,而不是让WebApi搞清楚:

Request