2

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

これを読んでくれて、そしてあなたが提供できる助け/アドバイスをありがとう!

4

5 に答える 5

0
  • 最初にコンテンツ タイプを次のように変更する必要があります: text/x-vcard
  • 次に、ASP MVC FileContentResult のみが機能することがわかりました。したがって、HTTP ヘッダーを書き換える代わりに、asp で連絡先を取得する適切な方法については、上記の行を使用するだけです。
  • 3番目は100%正しいかどうかわかりませんが、アクションはGETリクエストを取得し、「.vcf」拡張子を含む必要があります:somesite.com/ControllerName/ActionName.vcf

ただし、Web 構成の標準セットアップではドットが許可されていないため、

  • Forth は、構成にいくつかの inchancments を追加します

    <system.web>
    <httpHandlers> <add path=" .less" verb="GET" type="dotless.Core.LessCssHttpHandler, dotless.Core" /> <add path=" .vcf" type="System.Web .Handlers.TransferRequestHandler" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" /> </httpHandlers> </system.web> <system.webServer> <modules runAllManagedModulesForAllRequests="true" /> <validation validateIntegratedModeConfiguration="false" /> <handlers> <add name="dotless" path=" .less" verb="GET" type="dotless.Core.LessCssHttpHandler,dotless.Core" resourceType="File" preCondition= "" /> <add name="ApiURIs-ISAPI-Integrated-4.0" パス=".vcf" type="System.Web.Handlers.TransferRequestHandler" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" preCondition="integratedMode,runtimeVersionv4.0" /> </handlers> </システム.webServer>

これは Android ブラウザで vcard をダウンロードするためのトリッキーな方法ですが、他の電話ブラウザで連絡先のダウンロードを解決するのはより複雑です。

于 2013-06-16T13:29:00.900 に答える
0

あなたはあなたを閉じたことはありません:

public class APIController : Controller 
于 2012-10-16T16:06:08.567 に答える