0

ユーザーが「ファイルのアップロード」ボタンをクリックした後、Webページのフロントエンドから、サーバーで実行される処理のためにHttpPostedFileBaseをwcfサービスに送信する必要があります。最初にサービス コントラクトで HttpPostedFileBase を使用しましたが、機能しませんでした。次に、HttpPostedFileBase をデータ コントラクトに入れようとしましたが、それでも機能しませんでした。私はその問題を解決するのに 2 日間苦労しました。今ここにアプローチがあります:

サービス契約:

[ServiceContract]
public interface IFileImportWcf
{
    [OperationContract]
    string FileImport(byte[] file);
}

そして、バイト[]をストリームに、またはその逆に変換するこれら2つの方法を見つけました。

    public byte[] StreamToBytes(Stream stream)
    {
        byte[] bytes = new byte[stream.Length];
        stream.Read(bytes, 0, bytes.Length);
        stream.Seek(0, SeekOrigin.Begin);
        return bytes;
    }
    public Stream BytesToStream(byte[] bytes)
    {
        Stream stream = new MemoryStream(bytes);
        return stream;
    } 

コントローラーで:

[HttpPost]
public ActionResult Import(HttpPostedFileBase attachment)
{
    //convert HttpPostedFileBase to bytes[]
    var binReader = new BinaryReader(attachment.InputStream);
    var file = binReader.ReadBytes(attachment.ContentLength);
    //call wcf service
    var wcfClient = new ImportFileWcfClient();
    wcfClient.FileImport(file);
}

私の質問は次のとおりです: HttpPostedFileBase を wcf サービスに送信するより良い方法は何ですか?

4

1 に答える 1

1

ここでは、 WCF データ ストリーミングを使用する必要があります。

あなたの質問から理解したように、あなたは WCF サービス契約を管理できます。

契約を次のようなものに変更した場合:

[ServiceContract]
public interface IFileImportWcf
{
    [OperationContract]
    string FileImport(Stream file);
}

次に、クライアント側で使用できるようになります。

[HttpPost]
public ActionResult Import(HttpPostedFileBase attachment)
{
    var wcfClient = new ImportFileWcfClient();
    wcfClient.FileImport(attachment.InputStream);
}

設定でストリーミングを有効にする必要があることに注意してください

<binding name="ExampleBinding" transferMode="Streamed"/>

(詳しくは上のリンクをご覧ください)

于 2012-12-02T08:30:24.407 に答える