2017-11-10 232 views
0

我有一個要求,創建一個控制器操作,可以接受XML,JSON或形式urlencoded任何數據。但是,我無法使它工作。控制器操作,接收任何數據在XML JSON或表單urlencoded

如果我的動作有Dictionary<string, object>參數,它適用於JSON和XML數據,但不適用於表單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,另一個將處理表單urlencoded?

請注意,我正在使用.net40,我無法改變這種情況。值得注意的是,這個webapi是一個自運行的api,它將在Windows服務中運行。

+0

你可以使用JavaScript來提交表單?這將允許您在使用javascript提交之前將表單數據序列化爲json。 – user1934587390

+0

不... api不知道誰將會被調用......我需要支持json,xml和formdata。 – JobaDiniz

+0

@JobaDiniz然後,你將不得不接受一個字符串,並根據創建你自己的模型聯編程序的內容類型來解析主體以做同樣的事情(根據內容類型解析傳入的主體) – Nkosi

回答

0

我能夠使它發揮作用,讓讀取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 }); 
     } 
    } 
相關問題