2016-10-16 3 views
3

私はWeb APIを開発しようとしています。私はPOSTメソッドをテストすると、ボディは常にnullです。リクエストの送信時に、私はすべてを試してみました:私はブレークポイントを使用Web API:FromBody常にnull

 HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:1748/api/SomeAPI"); 
     req.Method = "post";; 
     var aaa = Encoding.Default.GetBytes("Test"); 
     req.ContentType = "application/xml"; 
     req.ContentLength = aaa.Length; 
     req.GetRequestStream().Write(aaa, 0, aaa.Length); 
     HttpWebResponse res =(HttpWebResponse) req.GetResponse(); 
     using (System.IO.StreamReader sr = new System.IO.StreamReader(res.GetResponseStream())) { 
      Console.WriteLine(sr.ReadToEnd()); 
     } 

を、そしてAPIが正常に呼び出されますが、本体部材は常にnullです:

[HttpPost] 
    public void Post([FromBody]String test) { 

    } 
+0

は以前、私は)(GetRequestStreamを分割しました。 –

+0

@RobLang:私はすでにそれを試みましたが、まだヌルになっています。 – Arrrr

+0

HTTPアナライザーのようなスニファを使用してリクエストを確認しようとしましたが、リクエストに問題があるようです。あなたは、サンプルリクエストを送信するために、クロム事前のレストクライアントを使用することができます。 – Vladimir

答えて

-1

2つのことを試して、第一、郵便配達員のような実証済みのツールを試してみてください。これにより、あなたの要求が何らかの形で不正になる可能性が排除されます。第2に、ContentTypeをtext/plainに変更してみてください。リクエストパイプラインでapplication/xmlが表示されている可能性がありますが、リクエストボディが無効なxmlであり、これは実際には悪いリクエストである必要がありますが、nullとしてシリアル化されています。

+0

何もない作品! – Arrrr

0

コンテンツタイプがXMLに設定されているため、XMLとしてデータを渡す必要があります。これは、データを<string>要素にラップすることを意味します。

RestSharp(http://restsharp.org/)を使用して.NetからWebAPI呼び出しを行うことをお勧めします。

 var client = new RestClient("http://localhost:1748/"); 
     var request = new RestRequest("api/SomeAPI", Method.POST); 
     request.AddBody("Test"); 
     var response = client.Execute(request); 

更新

私は、サンプルプロジェクトを作成しているし、それは絶対に正常に動作します:

サーバー側:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Http; 

namespace WebApplication1.Controllers 
{ 
    public class HomeController : ApiController 
    { 
     [Route("api/TestAPI")] 
     [HttpPost] 
     public IHttpActionResult Post([FromBody]String test) 
     { 
      return Ok(string.Format("You passed {0}.", test)); 
     } 
    } 
} 

クライアント側:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:1748/api/TestAPI"); 
      req.Method = "post"; ; 
      var aaa = Encoding.Default.GetBytes("\"Test\""); 
      req.ContentType = "application/json"; 
      req.ContentLength = aaa.Length; 
      req.GetRequestStream().Write(aaa, 0, aaa.Length); 
      HttpWebResponse res = (HttpWebResponse)req.GetResponse(); 
      using (System.IO.StreamReader sr = new System.IO.StreamReader(res.GetResponseStream())) 
      { 
       Console.WriteLine(sr.ReadToEnd()); 
      } 
     } 
    } 
} 

IISでWeb APIサービスをインストールし、コンソールアプリケーションを実行した後に、印刷します。

"You passed Test."

を応答を囲む引用符に注意してください。 あなたはXMLを使用したい場合、あなたはあなたが送信されているコンテンツの種類とデータを変更する必要があります:あなたが得る

var aaa = Encoding.Default.GetBytes("<string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/\">Test</string>"); 

応答は、デバッガ内の両方のサンプルがあります

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">You passed Test.</string>

ですテストパラメータに渡された正しい値。私はそれを閉じる()を呼び出すことができるように

+0

XML、JSON、プレーンテキストの場合は、実際には関係ありません。重要なことは、体が何であっても常にヌルであることです。私はそれがバグか何かを疑っている。 – Arrrr

+0

あなたの例では、ボディは 'Test'になります。サーバーに到達すると、サーバーを逆シリアル化する必要があります。コンテンツタイプはXMLなので、XMLとして解釈しようとしますが、失敗するでしょう。したがって、あなたはデータを渡さなかったとみなし、あなたのメソッドにNULLを渡します。あなたの体の生の内容(すなわち文字列)にアクセスしたい場合は、この記事をお読みください:[https://weblog.west-wind.com/posts/2013/dec/13/accepting-raw-request-body- content-with-aspnet-web-api](https://weblog.west-wind.com/posts/2013/dec/13/accepting-raw-request-body-content-with-aspnet-web-api) – bib1257

+0

ところで、JSON文字列は引用符で囲まれているので、同じ理由でJSONが失敗します。そうすれば、JSONで動作するようにするには、var aaa = Encoding.Default.GetBytes( "\" Test \ ""); あなたのメソッドは、 – bib1257

0

uが正しく値を送信する場合、これは100%に動作します

[HttpPost] 
public void SomeApi() 
{ 
    var test = HttpContext.Current.Request.Form["Test"]; 
} 

を試してみてください