2012-04-03 28 views
6

ASP.NET MVC 3で開発されたWebアプリケーションにXMLファイルを送信し、別のXMLを応答として受け取るコンソールアプリケーションを作成しようとしています。エラーがコンソールアプリケーションに返さコンソールアプリケーションからASP.NET MVCにファイルをアップロードする方法

です:コンソールアプリケーションのコードは

Object reference not set to an instance of an object.

です

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(); 
} 

The remote server returned an error: (500) Internal Server Error.

私はFiddler2をが実行して取得する場合、私はこのエラーが表示します

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と同じ結果がありました。

答えて

6

問題は、WebClient.UploadFileが、エンコードタイプが「multipart/form-data」に設定されたフォームを、MVCがマップする「file」という名前の入力を使用してポストしていないことです。

[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"); 
} 
+1

それは働いた!私はちょうど 'as HttpPostedFile'を削除する必要があった、コンパイルしていなかった...ありがとう! –

+0

おかげで、助けてくれた! – f0x

0

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

チェック

How to specify form parameter when using webclient to upload file

Send multipart/form-data content type request

+0

ニースのリンク。ちなみに、リンクはフォームを使って作業する必要はありません。クリスの答えは私の必要なものです。とにかくありがとう! =) –

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)); 

簡単! ;)