2012-11-02 33 views
0

当我试图调试代码时,在进入'添加附件'部分时,Watch 2屏幕上的ContentDisposition会给我附件的大小-1。为什么我的附件大小为-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 = "[email protected]"; 
    string EmailWork = "[email protected]"; 
    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大小的任何信息?

愿意提供更多信息/代码,如果需要的话。
在此先感谢,

+0

该文件是否真的存在?我会想象它不存在或您的应用程序没有权限访问该文件。 –

+0

文件excist,在使用的streamwriter代码中自动生成vCard。所以它被发送之前已经作出 – Lobato

+0

您是否尝试发送没有“attach.ContentDisposition.FileName”行的邮件? –

回答

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 = "[email protected]"; 
     string EmailWork = "[email protected]"; 
     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:我现在看到你解决你自己的问题。我为您未来的编码提供了一件事。这里是你可以用.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”。

+0

因此,我必须将所有内容转储到一个字节数组中,并将其复制到某个内容中,以免它突然变成封闭的流? – Lobato

+0

是为什么它给我-1大小的解决方案? – Lobato

+0

由于流关闭了,并且某处出现异常,所以无法看到它,或者流位置关闭(设置为最后一个字节)。我会冒险猜测,在Attachement对象中有一些异常处理,以防止“ObjectDisposedException”,这通常表明您的流已被关闭 – iMortalitySX

相关问题