ROMANCE DAWN for the new world

Microsoft Azure を中心とした技術情報を書いています。

Windows Phone 8.1 から Instapaper Simple API を呼び出すとエラーが発生する

先月、Windows 8.1 と Windows Phone 8.1 の共有コントラクトから、あとで読みたい記事の URL を Instapaper に保存できるアプリをリリースしました。

gooner.hateblo.jp

その際に、Shared プロジェクトに Instapaper Simple API の呼び出しメソッドを実装しました。

#InstapaperHelper.cs
public static async Task AddAsync(string userName, string password, string uri)
{
    try
    {
        using (var client = new HttpClient())
        {
            var content = new FormUrlEncodedContent(new Dictionary<string, string>
                {
                    { "username", userName },
                    { "password", password },
                    { "url",uri },
                });
            var res = await client.PostAsync("https://www.instapaper.com/api/add", content);
            res.EnsureSuccessStatusCode();
        }
    }
    catch (ArgumentException)
    {
        // [net_WebHeaderInvalidControlChars]
        // Arguments:
        // Debugging resource strings are unavailable.
        // Often the key and arguments provide sufficient information to diagnose the problem.
        // See http://go.microsoft.com/fwlink/?linkid=106663&Version=4.7.60408.0&File=System.Net.dll&Key=net_WebHeaderInvalidControlChars
        // Parameter name: name
 
        // WP8.1では成功しているにも関わらず、エラーが返されてしまうので、正常終了として扱う。
        return;
    }
    catch (Exception)
    {
        throw;
    }
}

このメソッドは、Windows 8.1 からであれば正常終了するのですが、Windows Phone 8.1 からは ArgumentException が発生してしまいます。例外は発生しますが、URL の保存には成功しています。原因が分からず、ArgumentException を無視して正常終了とする回避ロジックを入れて暫定対応しました。

// 追記 ---------- ↓

この記事を書いた後、Twitter で情報を頂きました。

qa.atmarkit.co.jp

こちらと同じ現象で、保存した記事のタイトルがレスポンスヘッダー(X-Instapaper-Title)で返されるのですが、日本語タイトルがそのままセットされていることが原因のようです。英語タイトルなら問題ありません。Instapaper 側に原因があり、クライアント側での対応は難しそうなので、当面は ArgumentException を正常終了として扱うようにします。

// 追記 ---------- ↑