2012-08-01 67 views
2

我正試圖編寫一個MVC3應用程序,當他們掃描QR碼時,動態生成一個vCard(.vcf)文件,供移動設備上的人下載。我找到一個示例here來構建和返回vCard。經過一些操作後,我可以在我的臺式機上運行它,但是每次我嘗試在移動設備上下載文件時,下載都會失敗。我曾以爲它發送的頭文件有問題,所以我做了一些挖掘,並在Android here的HTTP頭文件中找到了一些有用的信息。不幸的是,即使調整標題也沒有改變任何東西。MVC3電子名片在移動設備上下載失敗

第一部分是控制器,稍後這將採取URL參數。保持測試簡單。

public class APIController : Controller 
{ 

public vCardResult vCard() 
{ 
    vCard card = new vCard 
    { 
     FirstName = "First", 
     LastName = "Last", 
     StreetAddress = "70 Street Adr.", 
     City = "Atlanta", 
     State = "GA", 
     CountryName = "United States", 
     Mobile = "5558675309", 
     Organization = "MyCompany", 
     HomePage = "www.Google.com", 
     JobTitle = "Software Developer", 
     Zip = "30318", 
     Email = "[email protected]", 
    }; 

    return new vCardResult(card); 
} 

這裏是電子名片型號

public class vCard 
{ 
    //I cut out the properties to save space 

    public override string ToString() 
    { 

     var builder = new StringBuilder(); 

     builder.AppendLine("BEGIN:VCARD"); 
     builder.AppendLine("VERSION:2.1"); 
     builder.AppendLine("FN:" + FirstName + " " + LastName); 
     builder.AppendLine("N:" + LastName + ";" + FirstName); 
     builder.AppendLine("TEL;CELL:" + Mobile); 
     builder.AppendLine("TEL:"); 
     builder.AppendLine("EMAIL;INTERNET:" + Email); 
     builder.AppendLine("TEL;FAX:"); 
     builder.AppendLine("TITLE:" + JobTitle); 
     builder.AppendLine("ORG:" + Organization); 
     builder.AppendLine("ADR:;;" + StreetAddress + ";" + City + ";" + ";" + Zip + ";"); 
     builder.AppendLine("REV:20120730T15034z"); 
     builder.AppendLine("END:VCARD"); 

     return builder.ToString(); 

    } 
} 

最後是行動的結果

public class vCardResult : ActionResult 
{ 
    private vCard _card; 

    protected vCardResult() { } 

    public vCardResult(vCard card) 
    { 
     _card = card; 
    } 

    public override void ExecuteResult(ControllerContext context) 

    { 
     var response = context.HttpContext.Response; 
     response.ContentType = "text/vcard"; 
     response.AddHeader("Content-Disposition", "attachment; fileName=\"" + _card.FirstName + "_" + _card.LastName + ".VCF\""); 

     var cardString = _card.ToString(); 
     var inputEncoding = Encoding.Default; 
     var outputEncoding = Encoding.GetEncoding("windows-1257"); 
     var cardBytes = inputEncoding.GetBytes(cardString); 

     var outputBytes = Encoding.Convert(inputEncoding, 
           outputEncoding, cardBytes); 

     response.OutputStream.Write(outputBytes, 0, outputBytes.Length); 
    } 
} 

不是從我剛纔列舉的例子太多不同,但我想至少拿到這個在我進一步走得太遠之前運作正常。

我檢查了服務器響應類似的工作系統(我沒有訪問源代碼)的響應,我沒有看到很多差異,所以我不確定他們的vCard爲什麼會打開電話的聯繫人列表添加爲新聯繫人,並且我的下載失敗。答覆如下。

示例響應(工作):

HTTP/1.1 200 OK 
Server: Apache-Coyote/1.1 
Content-Disposition: attachment; filename=5240000053568089.vcf 
Content-Type: text/x-vcard 
Transfer-Encoding: chunked 
Date: Tue, 31 Jul 2012 21:18:31 GMT 

110 
BEGIN:VCARD 
VERSION:2.1 
FN:First Last 
N:Last;First 
TEL;CELL:5558675309 
TEL: 
EMAIL;INTERNET:[email protected] 
TEL;FAX: 
TITLE:Software Developer 
ORG:MyCompany 
ADR:;;70 Street Adr.;Atlanta;GA;30318; 
REV:20120523T150346Z 
END:VCARD 

0 

應用

HTTP/1.1 200 OK 
Cache-Control: private 
Transfer-Encoding: chunked 
Content-Type: text/vcard 
Server: Microsoft-IIS/7.0 
X-AspNetMvc-Version: 3.0 
Content-Disposition: attachment; fileName=First_Last.vcf 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Date: Tue, 31 Jul 2012 20:14:02 GMT 

105 
BEGIN:VCARD 
VERSION:2.1 
FN:First Last 
N:Last;First 
TEL;CELL:5558675309 
TEL: 
EMAIL;INTERNET:[email protected] 
TEL;FAX: 
TITLE:Software Developer 
ORG:MyCompany 
ADR:;;70 Street Adr.;Atlanta;GA;30346; 
REV:20120730T15034z 
END:VCARD 

0 

在此先感謝響應讀這篇文章,任何幫助/建議,您能提供!

回答

0

你永遠閉上你的:

public class APIController : Controller 
+0

它不是所必要的它不是一個點 – 2013-06-15 16:05:55

0
  • 第一件事需要將內容類型更改爲:文本/ X-名片
  • 然後我發現,只有ASP MVC FileContentResult工作。因此,對於 適當的方式來通過asp獲取聯繫而不是重寫HTTP 標題只需使用上面的行:File(outputBytes,「text/x-vcard」, Guid.NewGuid()。ToString());
  • 三不知道是不是100%正確,但你的行動必須採取GET請求 和conatains「的.vcf」擴展名,如: somesite.com/ControllerName/ActionName.vcf

但非標準設置web配置的禁止點所以

  • 給你配置

    <系統福斯添加一些inchancments。幅>
    < HttpHandlers的> <添加路徑= " .LESS "動詞= " GET "類型= " dotless.Core.LessCssHttpHandler,dotless.Core "/> <添加路徑= "的.vcf "類型= " System.Web.Handlers.TransferRequestHandler "動詞= " GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS "/> </httpH andlers > </system.web> <system.webServer> <模塊runAllManagedModulesForAllRequests = "真"/> <驗證validateIntegratedModeConfiguration = "假"/> <處理程序> <添加名=無點"路徑" = " .less "動詞= " GET "類型= " dotless.Core.LessCssHttpHandler,dotless.Core " = resourceType爲文件"前提" = " "/> <添加名稱= " ApiURIs-ISAPI集成-4.0 "路徑= "的.vcf "類型= "系統.Web.Handlers.TransferRequestHandler "動詞= " GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS "前提= " integratedMode,runtimeVersionv4.0 "/> < /處理程序> </system.webServer>

這一些棘手的方式由Android瀏覽器下​​載電子名片,但它表達更復雜的其他手機瀏覽器解決下載聯繫人