0

この単純なテストが機能したため (本体に文字列を渡す):

サーバーコード:

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 でクラッシュしました。

では、サーバーにバイト配列を受け入れ/認識/受信させるにはどうすればよいですか?

4

1 に答える 1

0

これは機能します:

ファイル自体、または文字通り渡すのでなく、ファイルの内容を渡すのであり、それで十分です。クライアントxml ファイルを作成する必要がある場合、次のように、送信する前にそのファイルを文字列にシリアル化する必要があります。

クライアント

private void button1_Click(object sender, EventArgs e)
{
    ProcessRESTPostXMLFileAsStr("http://Platypus:28642/api/Platypi/PostArgsAndXMLFileAsStr?serialNum=192837465&siteNum=42");
}

private void ProcessRESTPostXMLFileAsStr(string uri)
{
    using (var client = new WebClient())
    {
        client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
        StringBuilder sb = new StringBuilder();
        using (StreamReader sr = new StreamReader(@"C:\Platypus\eXtraneousMothLepidoptera.XML"))
        {
            String line;
            while ((line = sr.ReadLine()) != null)
            {
                sb.AppendLine(line);
            }
        }
        // I don't know why the prepended equals sign is necessary, but it is
        string allLines = "=" + sb.ToString();
        var result = client.UploadString(uri, "POST", allLines);
        MessageBox.Show(result);
    }            
}

サーバー (Web API アプリ)

[Route("api/Platypi/PostArgsAndXMLFileAsStr")]
public void PostArgsAndXMLFileAsStr([FromBody] string stringifiedXML, string serialNum, string siteNum)
{
    string s = string.Format("{0}{1}{2}", stringifiedXML, serialNum, siteNum);
    // Parsing the contents of the stringified XML left as an exercise to the exorcist
}
于 2014-02-26T19:34:27.947 に答える