QR コードをスキャンしたときにモバイル デバイスでダウンロードする vCard(.vcf) ファイルを動的に構築する MVC3 アプリケーションを作成しようとしています。ここで、vCard を作成して返す例を見つけました。いくつかの操作の後、デスクトップ マシンで動作させることができましたが、モバイル デバイスでファイルをダウンロードしようとするたびにダウンロードに失敗します。送信しているヘッダーに問題があると思っていたので、掘り下げて、アンドロイドの HTTP ヘッダーに関する有用な情報を見つけました。残念ながら、ヘッダーを微調整しても何も変わりませんでした。
最初の部分はコントローラーで、後で 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 = "FirstLast@MyCompany.com",
};
return new vCardResult(card);
}
そして、これがvCardモデルです
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:FirstLast@MyCompany.com
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:FirstLast@MyCompany.com
TEL;FAX:
TITLE:Software Developer
ORG:MyCompany
ADR:;;70 Street Adr.;Atlanta;GA;30346;
REV:20120730T15034z
END:VCARD
0
これを読んでくれて、そしてあなたが提供できる助け/アドバイスをありがとう!