この単純なテストが機能したため (本体に文字列を渡す):
サーバーコード:
public string PostArgsAndFile([FromBody] string value, string serialNum, string siteNum)
{
string s = string.Format("{0}-{1}-{2}", value, serialNum, siteNum);
return s;
}
クライアントコード:
private void ProcessRESTPostFileData(string uri)
{
using (var client = new WebClient())
{
client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
var data = "=Short test...";
var result = client.UploadString(uri, "POST", data);
MessageBox.Show(result);
}
}
...次に、さらに一歩進めようとしました(本当に必要なことに向けて-文字列ではなくファイルを送信します); サーバーコードを次のように変更しました。
public string PostArgsAndFile([FromBody] byte[] value, string serialNum, string siteNum)
{
byte[] bite = value;
string s = string.Format("{0}{1}{2}", value.ToString(), serialNum, siteNum);
return s;
}
...そしてこれに対するクライアントコード:
using (var client = new WebClient())
{
client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
var result = client.UploadFile(uri, @"C:\MiscInWindows7\SampleXLS.csv");
}
...しかし、それは実行時に次のように死にます:
System.Net.WebException は処理されませんでした HResult=-2146233079 Message=リモート サーバーがエラーを返しました: (415) サポートされていないメディア タイプ。
では、この方法でアップロードされたファイルを受け取るにはどうすればよいでしょうか? 必要なメディアの種類と指定方法は?
アップデート
最終的にファイル、または少なくともファイルの内容を送信する必要があるため、この SO 質問/回答を見つけ、コードを次のように変更しました。
using (var client = new WebClient())
{
client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
StringBuilder sb = new StringBuilder();
using (StreamReader sr = new StreamReader(@"C:\MiscInWindows7\SampleXLS.csv"))
{
String line;
while ((line = sr.ReadLine()) != null)
{
sb.AppendLine(line);
}
}
string allLines = sb.ToString();
byte[] byteData = UTF8Encoding.UTF8.GetBytes(allLines);
byte[] responseArray = client.UploadData(uri, byteData);
// Decode and display the response.
MessageBox.Show("\nResponse Received.The contents of the file uploaded are:\n{0}",
System.Text.Encoding.ASCII.GetString(responseArray));
}
...そして、byteDataが正しく割り当てられていることを示していますが、サーバーには何も送信されていないようです-サーバーの「値」プロパティ:
public void PostArgsAndFile([FromBody] byte[] value, string serialNum, string siteNum)
...メソッドが呼び出されたときは空のバイト配列です。
[FromBody] を削除しようとしましたが、役に立たず (変更なし)、[FromUri] に変更すると (うまくいくとは思いませんでしたが、ひばりで試してみました)、WebException でクラッシュしました。
では、サーバーにバイト配列を受け入れ/認識/受信させるにはどうすればよいですか?