0

「添付ファイルの追加」の部分にステップインしているときにコードをデバッグしようとすると、Watch 2画面のContentDispositionにより、添付ファイルの-1のサイズが表示されます。

これにより、コードがトリップし、エラーメッセージが表示されます。

メールの送信に失敗しました。

コード全体:

private Attachment createCardAttachment()
{
    //  Information string
    string FamilyName = "FamilyName";
    string FirstName = "FirstName";
    string MiddleName = "MiddleName";
    string Title = "Miss,Mr.";
    string Suffix = "suffix(s)";
    //  string Birthday = "YYYY-MM-DD";
    string WorkAddressStreet = "WorkAddressStreet";
    string WorkAddressCity = "WorkAddressCity";
    string WorkAddressStateProvince = "WorkAddressStateProvince";
    string WorkAddressZipPostalCode = "1234 AA";
    string WorkAddressCountry = "WorkAddressCountry";
    string HomeAddressStreet = "HomeAddressStreet";
    string HomeAddressCity = "HomeAddressCity";
    string HomeAddressStateProvince = "HomeAddressStateProvince";
    string HomeAddressZipPostalCode = "1234 AA";
    string HomeAddressCountry = "HomeAddressCountry";
    string EmailPersonal = "Person@personaldomain.com";
    string EmailWork = "Person@workdomain.com";
    string Organization = "Organization";
    string WorkPhone = "123-456-7890 ext 321";
    string WorkFax = "123-456-7890";
    string CellPhone = "123-456-7890";
    string HomePhone = "123-456-7890";
    string JobTitle = "Programmer";
    string WorkURL = "http://www.domain.com";
    string ID = Request.QueryString["ID"]; // Database QueryString

    //  Save vCard Generate Code as .vcf extension
    string path = ("C:\\local\\vCardGenerator.Website\\FirstName_LastName.vcf");

            // Test attachment send
    Attachment attach = null;

    MemoryStream ms = new MemoryStream();

    //  vCard C# Code
    using (StreamWriter sw = new StreamWriter(ms))
    {
        sw.Write("BEGIN:VCARD\r\n");
        sw.Write("VERSION:1.0\r\n");
        sw.Write("N;LANGUAGE=en-us:{0};{1};{2};{3};{4};;\r\n", FamilyName, FirstName, MiddleName, Title, Suffix);
        sw.Write("FN:{0} {1} {2} {3} {4}\r\n", Title, FirstName, MiddleName, Suffix, FamilyName);
        sw.Write("ORG:{0}\r\n", Organization, "\r\n");
        sw.Write("TEL;WORK;VOICE:{0}\r\n", WorkPhone, "\r\n");
        sw.Write("TEL;WORK;FAX:{0}\r\n", WorkFax, "\r\n");
        sw.Write("TEL;CELL;VOICE:{0}\r\n", CellPhone, "\r\n");
        sw.Write("TEL;HOME;VOICE:{0}\r\n", HomePhone, "\r\n");
        sw.Write("TITLE:{0}\r\n", JobTitle, "\r\n");
        sw.Write("ADR;INTL;PARCEL;WORK:;;{0}; {1}; {2}; {3}; {4};\r\n", WorkAddressStreet, WorkAddressCity, WorkAddressStateProvince, WorkAddressZipPostalCode, WorkAddressCountry);
        sw.Write("ADR;INTL;PARCEL;HOME:;;{0}; {1}; {2}; {3}; {4};\r\n", HomeAddressStreet, HomeAddressCity, HomeAddressStateProvince, HomeAddressZipPostalCode, HomeAddressCountry);
        sw.Write("URL;WORK:{0}\r\n", WorkURL);
        sw.Write("EMAIL;PREF;INTERNET:{0}\r\n", EmailPersonal);
        sw.Write("EMAIL;INTERNET:{0}\r\n", EmailWork);
        sw.Write("END:VCARD\r\n");


        ContentType ct = new ContentType(MediaTypeNames.Application.Octet);
        attach = new Attachment(ms, ct);
        // Goes well until here
        // Gives the attachment a size of -1
        attach.ContentDisposition.FileName = "FirstName_LastName.vcf";
        attach.Name = "FirstName_LastName.vcf";
        sw.Flush();
        sw.Close();
        ms.Close();

    }

    return attach;
}
    }
}

明確:

// Goes well until here
// Gives the attachment a size of -1
attach.ContentDisposition.FileName = "FirstName_LastName.vcf";

誰かが私に情報を提供できますか?なぜ私の添付ファイルのサイズは-1ですか?

必要に応じて、より多くの情報/コードを提供する用意があります。
前もって感謝します、

4

1 に答える 1

2

アタッチメントを使用する前に、メモリストリームを閉じています。それをバイト配列にダンプしてから添付ファイルにロードするか、完了するまでストリームを閉じないでください。

MemoryStreamが閉じられる前に添付ファイルのデータを設定していても、そのメモリストリームを使用しているため、突然閉じられたストリームであるとは思われないように、何かにコピーする必要があります。

編集:クローズドストリームにアクセスしようとして例外が発生しないことに正直驚いています。StreamWriterでの使用を取り除いて、sw.Close()とms.Close()を削除してみてください。おそらく、メモリストリームの位置をにリセットする必要があります。

ms.Position = 0;

ストリームライターとメモリストリームを適切に破棄できるように、バイト配列にコピーすることを提案しただけです。

EDIT2:これを試してください:::

    private Attachment createCardAttachment()
    {
        // new variable for size
        long attSize = 0;

        //  Information string
        string FamilyName = "FamilyName";
        string FirstName = "FirstName";
        string MiddleName = "MiddleName";
        string Title = "Miss,Mr.";
        string Suffix = "suffix(s)";
        //  string Birthday = "YYYY-MM-DD";
        string WorkAddressStreet = "WorkAddressStreet";
        string WorkAddressCity = "WorkAddressCity";
        string WorkAddressStateProvince = "WorkAddressStateProvince";
        string WorkAddressZipPostalCode = "1234 AA";
        string WorkAddressCountry = "WorkAddressCountry";
        string HomeAddressStreet = "HomeAddressStreet";
        string HomeAddressCity = "HomeAddressCity";
        string HomeAddressStateProvince = "HomeAddressStateProvince";
        string HomeAddressZipPostalCode = "1234 AA";
        string HomeAddressCountry = "HomeAddressCountry";
        string EmailPersonal = "Person@personaldomain.com";
        string EmailWork = "Person@workdomain.com";
        string Organization = "Organization";
        string WorkPhone = "123-456-7890 ext 321";
        string WorkFax = "123-456-7890";
        string CellPhone = "123-456-7890";
        string HomePhone = "123-456-7890";
        string JobTitle = "Programmer";
        string WorkURL = "http://www.domain.com";
        string ID = Request.QueryString["ID"]; // Database QueryString

        //  Save vCard Generate Code as .vcf extension
        string path = ("C:\\local\\vCardGenerator.Website\\FirstName_LastName.vcf");

        // Test attachment send
        Attachment attach = null;

        MemoryStream actualAttachment = new MemoryStream();

        //  vCard C# Code
        using (MemoryStream ms = new MemoryStream())
        using (StreamWriter sw = new StreamWriter(ms))
        {
            sw.Write("BEGIN:VCARD\r\n");
            sw.Write("VERSION:1.0\r\n");
            sw.Write("N;LANGUAGE=en-us:{0};{1};{2};{3};{4};;\r\n", FamilyName, FirstName, MiddleName, Title, Suffix);
            sw.Write("FN:{0} {1} {2} {3} {4}\r\n", Title, FirstName, MiddleName, Suffix, FamilyName);
            sw.Write("ORG:{0}\r\n", Organization, "\r\n");
            sw.Write("TEL;WORK;VOICE:{0}\r\n", WorkPhone, "\r\n");
            sw.Write("TEL;WORK;FAX:{0}\r\n", WorkFax, "\r\n");
            sw.Write("TEL;CELL;VOICE:{0}\r\n", CellPhone, "\r\n");
            sw.Write("TEL;HOME;VOICE:{0}\r\n", HomePhone, "\r\n");
            sw.Write("TITLE:{0}\r\n", JobTitle, "\r\n");
            sw.Write("ADR;INTL;PARCEL;WORK:;;{0}; {1}; {2}; {3}; {4};\r\n", WorkAddressStreet, WorkAddressCity, WorkAddressStateProvince, WorkAddressZipPostalCode, WorkAddressCountry);
            sw.Write("ADR;INTL;PARCEL;HOME:;;{0}; {1}; {2}; {3}; {4};\r\n", HomeAddressStreet, HomeAddressCity, HomeAddressStateProvince, HomeAddressZipPostalCode, HomeAddressCountry);
            sw.Write("URL;WORK:{0}\r\n", WorkURL);
            sw.Write("EMAIL;PREF;INTERNET:{0}\r\n", EmailPersonal);
            sw.Write("EMAIL;INTERNET:{0}\r\n", EmailWork);
            sw.Write("END:VCARD\r\n");


            ContentType ct = new ContentType(MediaTypeNames.Application.Octet);
            sw.Flush();

            attSize = ms.Length;

            //Added position set to makesure copy works right...
            ms.Position = 0;

            //Copy to the stream you plan to use
            ms.CopyTo(actualAttachment);
            actualAttachment.Position = 0;
        }

        attach = new Attachment(actualAttachment, ct);

        //Try to set the attachment size now
        attach.ContentDisposition.Size = attSize;

        attach.ContentDisposition.FileName = "FirstName_LastName.vcf";
        attach.Name = "FirstName_LastName.vcf";

        return attach;
    }

EDIT3:あなたがあなた自身の問題を解決したことがわかりました。将来のコーディングのためにもう1つ提供します。これは、.NETの任意のバージョンで使用でき、フレームワークのバージョンに関係なく使用できる拡張メソッドです。

public static class StreamExtensions
{
    public static void CopyToEx(this Stream fromStream, Stream toStream)
    {
        int read = 0;
        byte[] buffer = new byte[1024];
        while((read = fromStream.Read(buffer, 0, 1024) != 0)
        {
            toStream.Write(buffer, 0, read);
        }

        toStream.Position = 0;
    }
}

そうすれば、拡張メソッドを任意のプログラムに追加したり、将来使用するために「ツールキット」に入れたりすることができます。次に、「CopyTo」が存在しないかどうかは関係ありません。同じ方法でコードで「CopyToEx」を呼び出すことができます。

于 2012-11-02T14:57:45.393 に答える