2016-12-13 7 views
2

enter image description hereenter image description here私はポストマンでそれをしようとすると、それがうまく動作します。ただし、HttpClient APIを使用して投稿した場合、投稿するXMLデータに関連するシナリオでは、次のエラーが表示されます。C#HttpClient APIと郵便配達員テストの違いは?クライアントの呼び出しは郵便配達に動作しますが、いないC#のHttpClient getAsync私は残りのAPIのポストをテストしてい

"トランスポート接続からデータを読み取れません:既存の接続が強制的に閉じられました。リモートホスト。"

しかし、同じXMLコンテンツは、ステータスOKと適切な対応とポストマンに正常に動作します。

誰もがC#のHttpClient APIと郵便配達のテストを使用しての間の違いは何か知っていますか?郵便配達員の動作に合わせてAPIコールを設定するにはどうすればよいですか?

ここ

私はソースコードを添付し、ポストマンのスクリーンショット

public void createLoan() 
{ 
    string baseCreateLoanUrl = @"https://serverhost/create?key="; 
    var strUCDExport = XDocument.Load(@"C:\CreateLoan_testcase.xml"); 

    using (var client = new HttpClient()) 
    { 
     var content = new StringContent(strUCDExport.ToString(), Encoding.UTF8, Mediatype); 
     string createLoanApi = string.Concat(baseCreateLoanUrl, APIKey); 

     try 
     {   
      var response = client.PostAsync(createLoanApi, content).Result; 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Error Happened here..."); 
      throw; 
     } 

     if (response.IsSuccessStatusCode) 
     { 
      // Access variables from the returned JSON object 
      string responseString = response.Content.ReadAsStringAsync().Result; 
      JObject jObj = JObject.Parse(responseString); 

      if (jObj.SelectToken("failure") == null) 
      { 
       // First get the authToken 
        string LoanID = jObj["loanStatus"]["id"].ToString(); 
        MessageBox.Show("Loan ID: " + LoanID); 
      } 
      else 
      { 
       string getTokenErrorMsg = string.Empty; 

       JArray errorOjbs = (JArray) jObj["failure"]["errors"]; 
       foreach (var errorObj in errorOjbs) 
       { 
        getTokenErrorMsg += errorObj["message"].ToString() + Environment.NewLine; 
       } 
        getTokenErrorMsg.Dump(); 
      } 
     }   
} 

感謝!

+0

あなたはur postに契約(インターフェース)を追加できますか? – ahankendi

+0

申し訳ありません@ahankendi、残念ながら、私はサーバー側のAPIにアクセスする必要はありません。 – mting923

+0

おそらく問題とはあまり関係がありませんが、.Resultの使用を中止し、代わりにawaitの使用を開始してください。 .Resultはスレッドをブロックし、注意しないとデッドロックを引き起こす可能性があります。私はあなたの人生をはるかに簡単にするasync/awaitで作業する方法を学ぶことを提案します。 :) –

答えて

1

私の腸は私にそれが何か簡単だと言います。まず、APIが動作することを知っているので、HttpClientをどのように使用しているかが分かります。 this SO answerにより示唆されるように

まず物事まず、シングルトンとしてそれを作成し、試してみて、コンセンサスはHttpClientをを配置する必要がないということであるので、完全にusingステートメントをドロップ:

private static readonly HttpClient HttpClient = new HttpClient(); 

私はそれを思うだろうAPIに問題を引き起こしているコンテンツエンコードラインに問題があるか、問題が発生します。それが好きではないことが欠けているものがありますか、私はここに郵便配達の要求の違いがあると確信しています。たぶん、JSONのALAとしてそれを送信してみてください:

 var json = JsonConvert.SerializeObject(strUCDExport.ToString()); 
    var content = new StringContent(json, Encoding.UTF8, Mediatype); 

たぶん、あなたが不足している何かが表示されます対ポストマンからヘッダ、私は本当の答えがあるだろうと思います。フィドラーをバックグラウンドで実行し、Postman経由で送信し、チェックしてから、コードを実行して再チェックしてください。 Postmanのヘッダーにあるすべての属性タグに細心の注意を払うと、APIが機能して何かが欠落しています。フィドラーはあなたに言うでしょう。ヘッダを比較した後、私は問題は私のクライアントのヘッダーがこれを持っていナードさんのコメントについて

+0

あなたの詳細な提案をお寄せいただきありがとうございます。しかし、今私が抱いていたのは、バイクを脇に置いていました。私は以前のようにエラーがありません。代わりに、 "融資番号があるローンがすでにあります:" 1612EM000064 "、apiのように聞こえて2回のショットがあり、2回目の返答があります...なぜフィドラーが? – mting923

+0

は、ヘッダー行をフィドラーを使用して行ごとに比較した後、「Expect:100-continue」を削除して解決しました。 – mting923

1

おかげで、: 期待:郵便配達員が持っているわけではありませんが

100-続けます。

私はServicePointManagerを使用してこれを削除すると:

ServicePointManager.Expect100Continue = false; 

すべてが今も元気そうです。すべての入力をありがとう!

関連する問題