2015-09-04 49 views
0

我想從C#調用休息API方法。問題是它傳遞null的所有內容類型爲body參數。我在下面分享了我的代碼。除了這段代碼之外,我嘗試寫入body參數來請求stream.It也沒有工作。我也嘗試過'application/x-www-form-urlencoded'作爲內容類型。RESTAPI身體參數在C#中調用時傳遞null#

調用從C#示例REST API方法:

 string token = Server.UrlEncode("v0WE/49uN1/voNwVA1Mb0MiMrMHjFunE2KgH3keKlIqei3b77BzTmsk9OIREken1hO9guP3qd4ipCBQeBO4jiQ=="); 
     string url = "http://localhost:2323/api/Applications/StartProcess?token=" + token; 
     string data = @"{""ProcessParameters"": [{ ""Name"":""flowStarter"",""Value"": ""Waffles"" }], 
         ""Process"": ""RESTAPISUB""}"; 

     System.Net.Http.HttpClient client = new System.Net.Http.HttpClient(); 
     client.BaseAddress = new System.Uri(url); 
     byte[] cred = UTF8Encoding.UTF8.GetBytes("username:password"); 
     client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(cred)); 
     client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); 

     System.Net.Http.HttpContent content = new StringContent(data, UTF8Encoding.UTF8, "application/json"); 
     HttpResponseMessage messge = client.PostAsync(url, content).Result; 
     string description = string.Empty; 
     if (messge.IsSuccessStatusCode) 
     { 
      string result = messge.Content.ReadAsStringAsync().Result; 
      description = result; 
     } 

的REST API方法:

[HttpPost] 
    [ActionName("StartProcess")] 
    public int StartProcess([FromUri]string token,[FromBody]WorkflowStartParameters parameters) 
    { 
     try 
     { 
      LoginInformation info = CasheProcesses.ReadCashe(token); 
      eBAWSAPI api = Service.GetWSService(); 
      WorkflowProcess proc = api.StartProcess(info.Id, info.Password, info.ImpersonateUserId, info.Language, parameters); 

      return proc.ProcessId; 
     } 
     catch (Exception ex) 
     { 
      throw new Exception("An error occured when starting process,exception detail:" + ex); 
     } 
    } 

WorkflowStartParameters類結構:

public class WorkflowStartParameters 
    { 
     public WorkflowParameter[] ProcessParameters; 
     public string Process { get; set; } 
    } 
    public class WorkflowParameter 
    { 
     public string Name { get; set; } 
     public string Value { get; set; } 
    } 

我已搜查這個問題很多。這似乎是一個非常普遍的問題。我剛剛發現這個解決方案正常工作,將請求參數傳遞給rest API方法並從那裏讀取身體參數。但對我來說這不是一個有效的解決方案。

如果您有任何想法,請隨時分享。

感謝, Zehra

+0

您可以更新您的問題,並表示這是什麼物體看起來像:WorkflowStartParameters?我的猜測是你發送的內容不能序列化回該類型。你也應該考慮用像NewtonSoft.Json這樣的東西來解析你的對象到json中(如果你還沒有它的話,它有一個nuget pckage)。 –

+0

確實命名了嗎?你有'工作流參數'在數據和'工作流參數'作爲參數..如果你剛剛離開'WorkflowParameter'從數據,只是通過字段 – JamieD77

+0

@StephenBrickner感謝回覆,我認爲序列化是確切的問題,因爲當我發送身體參數作爲字符串,它工作正常。但我已經嘗試發送序列化的數據它傳遞仍復位類型爲null.By的方式,我已經添加了WorkflowStartParameters類結構到我的問題。 –

回答

0

最後我已經實現了對填寫的數據發送到服務器。這是關於序列化問題。但是在發送數據之前,它並不適用於json序列化。我已將DataContract屬性添加到我的課程,並且它可以正常工作。

不幸的是,我仍然無法弄清楚這一點,當我從java腳本進行ajax調用時,它沒有DataContract屬性,但如果我在c#中調用它,它需要DataContract屬性。如果有人分享關於此的信息,我將不勝感激!

我分享新的階級結構,其他的一切不過這仍然相同:

[Serializable] 
    [DataContract] 
    public class WorkflowParameter 
    { 
     [DataMember] 
     public string Name { get; set; } 
     [DataMember] 
     public string Value { get; set; } 
    } 

    [Serializable] 
    [DataContract] 
    public class WorkflowStartParameters 
    { 
     [DataMember] 
     public WorkflowParameter[] ProcessParameters { get; set; } 
     [DataMember] 
     public string Process { get; set; } 
    } 
0

我不知道它是否能解決你的問題,但讓我試試。 我想你沒有必要利用Server.UrlEncode在您的電話,但:

Dim myUri As New Uri(Token) 

而且我猜你一定不能也編碼您的用戶名和密碼 - 嘗試將它們作爲字符串。

0

您的問題似乎是在這裏:

public class WorkflowStartParameters 
{ 
    public WorkflowParameter[] ProcessParameters; <---- needs get/set 
    public string Process { get; set; } 
} 

這必須是一個公共財產妥善連載。目前,您已將其設置爲公共領域。只需添加{get;組; }並嘗試一下。我還會考慮使用Newtonsoft.Json序列化以確保您的對象正確序列化。試圖用轉義字符串來做到這一點將會讓你發送的數據越來越多。

順便說可能有問題,有時序列化陣列,我想改變這種狀況到:

public List<WorkflowParameter> ProcessParameters{get;set;}