1

呼び出し元のHTTPHandler.ashxファイルにファイルをダウンロードするために使用されるWebメソッドに問題があります。ハンドラーは次のようにwebmethodを呼び出します。

byte[] docContent;
string fileType;
string fileName;
string msgInfo = brokerService.DownloadFile(trimURL, recNumber, out docContent, out fileType, out fileName);

呼び出されたwebmethodでは、使用する前にバイト配列を初期化する必要があります。そうしないと、すべてのreturnステートメントでコンパイラエラーが発生します。

The out parameter 'docContents' must be assigned to before control leaves the current method

空の配列に設定しようとしましたが、Buffer.BlockCopyメソッドが失敗します。

Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection.
mscorlib
  at System.Buffer.BlockCopy(Array src, Int32 srcOffset, Array dst, Int32 dstOffset, Int32 count)

初期化する必要があることはわかっていますが、データベースにアクセスするまで、必要な配列の長さがわかりません。デバッグを通じて、Buffer.BlockCopyを除くすべてのコードが機能することを確認しました。

    public string DownloadFile(string trimURL
        , string TrimRecordNumber
        , out byte[] docContents
        , out string returnFiletype
        , out string returnFilename)
    {
        docContents = new byte[0];
        returnFiletype = null; returnFilename = null;
        try
        {
            ConnectToTrim(trimURL);
            if (!db.IsValid)
                return "CRITICAL: Database Is NOT Valid";
            Record myRec = db.GetRecord(TrimRecordNumber);
            if (myRec == null)
                return "CRITICAL: Record not found.";
            uint bufferSize = 10000;
            int documentLength = myRec.DocumentSize;
            byte[] result = new byte[documentLength];
            byte[] buffer = new byte[bufferSize];
            uint bytesRead;
            uint totalBytesRead = 0;
            TRIMSDK.IStream docStream = myRec.GetDocumentStream(string.Empty, false, string.Empty);
            while (totalBytesRead < documentLength)
            {
                docStream.RemoteRead(out buffer[0], 10000, out bytesRead);
                for (int i = 0; i < bytesRead; i++)
                {
                    result[totalBytesRead] = buffer[i];
                    totalBytesRead += 1;
                }
            }
            returnFiletype = myRec.Extension;
            returnFilename = myRec.SuggestedFileName;
            Buffer.BlockCopy(result, 0, docContents, 0, result.Length); 
            return string.Format("OK-Document for recordnumber({0}): {1}.{2} - size: {3} bytes",
                TrimRecordNumber, returnFilename, returnFiletype, Convert.ToString(documentLength)); 
        }
        catch (Exception ex)
        {
            return LogException(ex, "CRITICAL: Exception in DownloadFile method has been logged:", trimURL, 100);
        } 
    } 
4

1 に答える 1

5

nullに初期化することから始めることができます。を呼び出す直前にBuffer.BlockCopy、適切な長さに割り当てて初期化します。

これは次のようになります。

public string DownloadFile(string trimURL
    , string TrimRecordNumber
    , out byte[] docContents
    , out string returnFiletype
    , out string returnFilename)
{
    docContents = null;

    //...

        returnFiletype = myRec.Extension;
        returnFilename = myRec.SuggestedFileName;
        docContents = new byte[result.Length]; // Allocate appropriately here...
        Buffer.BlockCopy(result, 0, docContents, 0, result.Length); 
        return ...

または、結果を直接割り当ててにコピーすることもできます。これにより、完全docContentsに不要になります。ただし、全体的なフロー制御をそのままにしておきたい場合は、最初resultにに初期化する必要があります。null

于 2011-08-30T20:00:01.487 に答える