我正試圖編寫一個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
在此先感謝響應讀這篇文章,任何幫助/建議,您能提供!
它不是所必要的它不是一個點 – 2013-06-15 16:05:55