7

ASP.NET MVC 3で開発されたWebアプリケーションにXMLファイルを送信し、応答として別のXMLを受信するコンソールアプリケーションを作成しようとしています。

コンソールアプリケーションで返されるエラーは次のとおりです。

リモートサーバーがエラーを返しました:(500)内部サーバーエラー。

Fiddler2を実行すると、次のエラーが表示されます。

オブジェクト参照がオブジェクト インスタンスに設定されていません。

コンソールアプリケーションのコードは次のとおりです。

static void Main(string[] args)
{
    var wc = new WebClient();
    byte[] response = wc.UploadFile("http://mysite.com/Tests/Test", "POST", "teste.xml");
    string s = System.Text.Encoding.ASCII.GetString(response);
    Console.WriteLine(s);
    Console.ReadKey();
}

MVCコントローラーのコードは次のとおりです。

[HttpPost]
public ActionResult Test(HttpPostedFileBase file)
{
    XElement xml = XElement.Load(new System.IO.StreamReader(file.InputStream));
    var test = new MyTest();
    return File(test.RunTest(xml), "text/xml", "testresult.xml");
}

RunTest()このメソッドは、フォームを介して(同じ名前のメソッドで、メソッドGETを使用して)ファイルをアップロードするときに機能するため、うまく機能します。RunTest()応答とともにXMLを返します。

MVCアプリケーションをデバッグすると、問題が発生します。変数fileがnullです。

どうすれば修正できますか?実際にファイルを送信するには、コンソールアプリケーションで何を変更する必要がありますか?それとも、MVCメソッドを変更する場合ですか?

そして、使用する前にWebClient、ここでこのコードを試しました:http: //msdn.microsoft.com/en-us/library/debx8sh9.aspx、そして同じ結果が得られました。

4

3 に答える 3

8

問題は、WebClient.UploadFileが、MVCがマップする「file」という名前の入力を使用して、enctypeがmultipart/form-dataに設定されたフォームを投稿していないことです。サーバー側のメソッドを次のように変更してみてください。

[HttpPost]
public ActionResult Test()
{
    var file = Request.Files[0] as HttpPostedFile;
    XElement xml = XElement.Load(new System.IO.StreamReader(file.InputStream));
    var test = new MyTest();
    return File(test.RunTest(xml), "text/xml", "testresult.xml");
}
于 2012-04-03T22:27:45.370 に答える
0

アップロードされたファイルでパラメータの名前を渡す必要があります。これはWebClientでは不可能です。

小切手

webclientを使用してファイルをアップロードするときにフォームパラメータを指定する方法

multipart/form-dataコンテンツタイプリクエストを送信します

于 2012-04-03T22:31:14.903 に答える
0

誰かがわずかに異なるが関連する問題を抱えている場合:

UploadDataまた、の代わりに関数を使用してそれを行う必要がありましたUploadFile。この場合、コントローラーに書き込む代わりに、次のようにします。

var file = Request.Files[0] as HttpPostedFile;
XElement xml = XElement.Load(new System.IO.StreamReader(file.InputStream));

簡単に書くことができます:

XElement xml = XElement.Load(new System.IO.StreamReader(Request.InputStream));

より簡単に!;)

于 2012-04-05T19:16:07.987 に答える