2017-08-11 231 views
0

我試圖通過HTTP客戶端訪問API的Post方法並傳遞AuthToken。當我嘗試訪問post man時,我能夠得到響應,但是當我用C#運行時,得到了StatusCode:401,ReasonPhrase:'未授權'錯誤。我與我的代碼一起共享郵遞員的請求和響應屏幕。任何人都可以讓我知道我在代碼中所犯的錯誤以及如何解決問題。下面StatusCode:401,ReasonPhrase:使用C#通過HTTPClient調用Post方法時顯示'未授權'

Postman Request Header and Response Body

Postman Request Body

是我的C#代碼。

public class PostEmpData 
{ 
    public string cExternalGUID = "10134", 
    cEmployeeID = "10134", cLastName = "Anderson", cFirstName = "Derek", cAccessGroup = "", cActive = "A"; 
    public int nCardNumber = 10134, nPayMethod = 2; 
    public string[] cGroupsList = new string[0] { }; 
    public DateTime dHireDate = DateTime.Parse("1999/11/03"), dTermDate = DateTime.Parse("01/01/0001"), dRateEffectiveDate = DateTime.Parse("2017 - 07 - 15"); 
    public decimal nPayRate = 1500; 
} 

    public class PostEmployeeClass 
{ 
    public int _interfaceID { get; set; } 
    public int _errorCode { get; set; } 
    public string _errorDescription { get; set; } 
    public List<EmpPostResponse> respList; 
} 

public class EmpPostResponse 
{ 
    public string RetKey { get; set; } 
    public int ErrorCode { get; set; } 
    public string Description { get; set; } 
    public string Success { get; set; } 
    public string SecondaryList { get; set; } 
} 


    static async Task<List<EmpPostResponse>> CallPostEmployeeAsync(object postdata) 
    { 
     Console.WriteLine("Post Employee Process Started"); 
     PostEmployeeClass authclass = null; 
     List<EmpPostResponse> data = null; 
     HttpResponseMessage response = await client.PostAsJsonAsync("xxxxxxV2/api/ED907F98-9132-4C7D-B4D4-7648A2577F6D/Integration/employees", postdata); 
     response.EnsureSuccessStatusCode(); 

     if (response.IsSuccessStatusCode) 
     { 
      Console.WriteLine("success"); 
      authclass = await response.Content.ReadAsAsync<PostEmployeeClass>(); 

      data = authclass.respList; 
     } 
     else 
      Console.WriteLine("fail:" + response.StatusCode.ToString()); 

     return data; 
    } 
    static void Main(string[] args) 
    { 
     Console.WriteLine("Starting the Process"); 
     RunAsync().Wait(); 
    } 
    static async Task RunAsync() 
    { 
     PostEmpData objPost = new PostEmpData(); 
     client.BaseAddress = new Uri("https://xxxx.xxxxx.com/"); 
     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
     try 
     { 
      string AuthToken="XXXXXXXXXXXXX"; 
      client.DefaultRequestHeaders.Add("AuthToken", AuthToken); 

      Console.WriteLine(AuthToken); 

      var postdata = CallPostEmployeeAsync(objPost); 

     }catch(Exception ex) 
     { 
      Console.WriteLine(ex.ToString()); 
     } 
+0

安裝* Fiddler *,比較郵差到C#請求和播放差異。 –

+0

找到問題的最佳方式是使用wireshark或fiddler之類的嗅探器。使用post man與http客戶端比較http頭。從初始請求的第一個標題開始,使其看起來完全像郵遞員標題。 – jdweng

+0

絕對在Postman上寫出代碼之前試用它。 – Rafael

回答

0

我已閱讀了您的代碼,並且發現了一些我注意到的事情。

有一件事情不會奏效:PostEmpData將序列化爲一個空對象,因爲它不包含任何屬性。所以身體會是這樣的:{}。您需要爲課程添加屬性:

public class PostEmpData 
{ 
    public string cExternalGUID { get; set; } = "10134"; 
    public string cEmployeeID { get; set; } = "10134"; 
    public string cLastName { get; set; } = "Anderson"; 
    public string cFirstName { get; set; } = "Derek"; 
    public string cAccessGroup { get; set; } = ""; 
    public string cActive { get; set; } = "A"; 
    public int nCardNumber { get; set; } = 10134; 
    public int nPayMethod { get; set; } = 2; 
    public string[] cGroupsList { get; set; }= new string[0] { }; 
    public DateTime dHireDate { get; set; }= DateTime.Parse("1999/11/03"); 
    public DateTime dTermDate { get; set; }= DateTime.Parse("01/01/0001"); 
    public DateTime dRateEffectiveDate { get; set; }= DateTime.Parse("2017 - 07 - 15"); 
    public decimal nPayRate { get; set; }= 1500; 
} 

這很可能會導致未經授權的回覆。而且它可能與令牌無關。

與郵遞員請求相比,還有另一個區別。通過郵遞員發送一個對象[{}]的數組,但通過代碼發送一個對象。所以你可能不得不張貼PostEmpData的列表。

+1

感謝您的回覆,它確實幫助我解決了問題。我爲我的課程做了一些改變,現在它運行良好。 –

相關問題