2017-09-19 6 views
0

私はC#、剣道MVC、Razorプロジェクトを持っています。ユーザーは剣道グリッド内の行をクリックし、変更イベントを発生させ、そのイベントはコントローラーへのAPI呼び出しを行い、コントローラーはpdfファイルを読み込んでユーザーにダウンロードしてダウンロードします。私はcsvファイルでこれを行いました。うまくいきましたが、pdfsではエラーが発生します。誰かがこのコードがpdfsで動作しない理由を教えてもらえますか?C#でpdfをどのように読んで、そのファイルをユーザーに返しますか?

Javascriptを見る

window.location = "/api/WoApi/GetPDF/1?pdf=" + JSON.stringify(ID); 

C#

[HttpGet] 
public System.Net.WebResponse GetPDF(string pdf) 
{ 
    System.Net.WebRequest request = System.Net.WebRequest.Create("C:\\inetpub\\wwwroot\\Projects\\Attachments\\Invoice_2424.pdf"); 
    System.Net.WebResponse response = request.GetResponse(); 

    return response; 
} 
コントローラ

でのエラーメッセージ

> <Error> 
<Message>An error has occurred.</Message> 
<ExceptionMessage> 
The 'ObjectContent`1' type failed to serialize the response body for content type 'application/xml; charset=utf-8'. 
</ExceptionMessage> 
<ExceptionType>System.InvalidOperationException</ExceptionType> 
<StackTrace/> 
<InnerException> 
<Message>An error has occurred.</Message> 
<ExceptionMessage> 
Type 'System.Net.FileWebResponse' with data contract name 'FileWebResponse:http://schemas.datacontract.org/2004/07/System.Net' is not expected. Consider using a DataContractResolver if you are using DataContractSerializer or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to the serializer. 
</ExceptionMessage> 
<ExceptionType> 
System.Runtime.Serialization.SerializationException 
</ExceptionType> 
<StackTrace> 
at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, Boolean verifyKnownType, RuntimeTypeHandle declaredTypeHandle, Type declaredType) at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithXsiTypeAtTopLevel(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle originalDeclaredTypeHandle, Type graphType) at System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) at System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) at System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) at System.Runtime.Serialization.DataContractSerializer.WriteObject(XmlWriter writer, Object graph) at System.Net.Http.Formatting.XmlMediaTypeFormatter.<>c__DisplayClass7.<WriteToStreamAsync>b__6() at System.Threading.Tasks.TaskHelpers.RunSynchronously(Action action, CancellationToken token) 
</StackTrace> 
</InnerException> 
</Error> 

** UPDATE#1 **

私は次のコードとを得ましたファイルを返すが、私はまだ同じエラーメッセージが表示されます:

string file = "C:\\inetpub\\wwwroot\\Projects\\Attachments\\Invoice_2424.pdf"; 
var test = new System.Web.Mvc.FilePathResult(file, "application/pdf"); 
return test; 

エラーメッセージ:

Error> 
<Message>An error has occurred.</Message> 
<ExceptionMessage> 
The 'ObjectContent`1' type failed to serialize the response body for content type 'application/xml; charset=utf-8'. 
</ExceptionMessage> 
<ExceptionType>System.InvalidOperationException</ExceptionType> 
<StackTrace/> 
<InnerException> 
<Message>An error has occurred.</Message> 
<ExceptionMessage> 
Type 'System.Web.Mvc.FilePathResult' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute. If the type is a collection, consider marking it with the CollectionDataContractAttribute. See the Microsoft .NET Framework documentation for other supported types. 
</ExceptionMessage> 
<ExceptionType> 
System.Runtime.Serialization.InvalidDataContractException 
</ExceptionType> 
<StackTrace> 
at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.ThrowInvalidDataContractException(String message, Type type) at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.CreateDataContract(Int32 id, RuntimeTypeHandle typeHandle, Type type) at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetDataContractSkipValidation(Int32 id, RuntimeTypeHandle typeHandle, Type type) at System.Runtime.Serialization.DataContractSerializer.GetDataContract(DataContract declaredTypeContract, Type declaredType, Type objectType) at System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) at System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) at System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) at System.Runtime.Serialization.DataContractSerializer.WriteObject(XmlWriter writer, Object graph) at System.Net.Http.Formatting.XmlMediaTypeFormatter.<>c__DisplayClass7.<WriteToStreamAsync>b__6() at System.Threading.Tasks.TaskHelpers.RunSynchronously(Action action, CancellationToken token) 
</StackTrace> 
</InnerException> 
</Error> 

答えて

-1

それはテキストベースのフォーマットであるため、CSVファイルには、働いてもよいが、PDFファイルではありません。あなたがウェブAPIを使用しているよう

が見える、

[HttpGet] 
public HttpResponseMessage Generate() 
{ 

    var stream = new FileStream("C:\\inetpub\\wwwroot\\Projects\\Attachments\\Invoice_2424.pdf", FileMode.Open); 

    var result = new HttpResponseMessage(HttpStatusCode.OK) 
    { 
     Content = new ByteArrayContent(stream.ToArray()) 
    }; 
    result.Content.Headers.ContentDisposition = 
     new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment") 
    { 
     FileName = "fileName.pdf" 
    }; 
    result.Content.Headers.ContentType = 
     new MediaTypeHeaderValue("application/octet-stream"); 

    return result; 
} 
+0

ResponseとFileはどのライブラリですか?レスポンスに「現在のコンテキストに存在しません」、File "System.IO.File ...はメソッドのように使用できません"というエラーが表示されます。 Locke125との私の会話も見てください。正しいライブラリーを手に入れることができれば、このような音が出ます。 – boilers222

+0

ASP.Net MVCを使用していますか? –

+0

'Response'と 'File(filedata、contentType)'はSystem.Web.Mvcからのものです。 –

1

あなたはまた、適切なMIMEタイプとURLを指定するだけで、ファイルを返すようにしようとすることができ、この方法を試してみてください。

[HttpGet] 
public ActionResult GetPDF(string pdf) 
{ 
    string file = "C:\\inetpub\\wwwroot\\Projects\\Attachments\\Invoice_2424.pdf"; 

    return File(file, "application/pdf"); 
} 
+0

をご覧ください。あなたの例では "File"はどのようなタイプですか?私はSystem.IO.File( "application/pdf"ファイル)を試しました。しかし、 "ファイルは方法のように使うことはできません"と言います。 – boilers222

+0

これは 'FilePathResult'であり、' using System.Web.Mvc'から来るはずです。https://msdn.microsoft.com/en-us/library/system.web.mvc.filepathresult(v=vs.118) .aspx –

+0

これを動作させることはできません。 File(file、 "application/pdf")だけを使用すると、 "メソッドのように使用することはできません"と表示されます。 System.Web.Mvc.File(file、 "application/pdf")を使用すると、ファイルがネームスペースに存在しません。 System.Web.Mvc.FilePathResult(file、 "application/pdf")を使用すると、 "メソッドのように使用できません"というエラーが表示されます(FilePathResultは送信したリンクから取得されます)。私が間違っていることは何か考えていますか? – boilers222

関連する問題