4

数年前に、モバイル アプリケーション用の .NET Web サービスを開発しました。このサービスは、iPhone/Android/Blackberry/WindowsPhone およびサードパーティによって開発されたすべてのネイティブ アプリによって呼び出されています。JSON のサポートを追加したため、一部のアプリは JSON 呼び出しを使用してこのサービスにアクセスし、一部のアプリは SOAP を使用してアクセスします。

Web サービスは、要求が HTTP ヘッダーで送信された場合にのみ JSON を返しますContent-type: application/json

Content-Typeある Android プラットフォーム (具体的には Galaxy Nexus) で、 GET 要求のヘッダーが欠落しているという問題が発生しました。サード パーティのアプリ開発者は多くの解決策を試しましたが、GET 要求の Content-Type を強制的に送信する方法を見つけることができませんでした。

ただし、ヘッダーが正しく設定されて送信されていることに気付きましたが、そのような場合に JSON を返すAccept代わりにそのヘッダーを使用するように Web サービスを変更する方法が見つかりませんでした。Content-Type

以下はリクエストの例です。必要に応じて JSON ではなく、XML レスポンスが返されます。

GET /mobile/service.asmx/Logon?system=2&username='test'&password='1234' HTTP/1.1
Accept: application/json
User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4)
Connection: Keep-Alive

また、Web サービス コードからの抜粋:

    [WebMethod(
        BufferResponse = false,
        CacheDuration = 0
        )]
    [ScriptMethod(UseHttpGet = true,ResponseFormat = ResponseFormat.Json) ]
    public LogonResponse Logon(int system, string username, string password)
    {
        return service.Logon(system, username, password);
    }

何らかの方法で JSON 応答を強制する方法、またはAcceptヘッダーを調べてそうする方法はありますか? (WCFへの移行以外?)

そうでない場合、アプリケーション開発者から、Spring フレームワークを使用して HTTP リクエストを作成するように言われました。アプリ側で機能させ、Content-TypeGET 要求のヘッダーを強制的に送信する方法についての解決策があれば、それも高く評価されます!

ありがとう!

4

3 に答える 3

2

これを試すことができます(現時点ではテストできません)。

public LogonResponse Logon(int system, string username, string password)
{

    string accept = HttpContext.Current.Request.Headers("Accept");
    if (!string.IsNullOrEmpty(accept)) {
        if (accept.ToLower.EndsWith("application/json")) {
            HttpContext.Current.Response.ContentType = "application/json";
        }
    }    
    return service.Logon(system, username, password);
}

編集:リクエストをレスポンスに更新しました

于 2012-09-27T05:05:51.343 に答える
0

次を使用して、予想される「d」要素で全体をラップします。

    public static T SetOutput<T>(T response)
    {
        var accept = HttpContext.Current.Request.Headers["Accept"];
        var ctype = HttpContext.Current.Request.ContentType;

        if (string.IsNullOrEmpty(ctype) && !string.IsNullOrEmpty(accept)) 
            if (accept.ToLower().EndsWith("application/json"))
            {
                var wrapper = new JSONWrapper<T> {d = response};
                var serializer = new JavaScriptSerializer();
                var json = serializer.Serialize(wrapper);
                HttpContext.Current.Response.ContentType = "application/json";
                HttpContext.Current.Response.Write(json);
                HttpContext.Current.Response.End();
            }

        return response;
    }

    public class JSONWrapper<T> 
    {
        public T d { set; get; }
    } 
于 2012-09-27T12:00:56.243 に答える