1

1つのメソッドがxmlの結果を返し、もう1つのメソッドがjsonの結果を返すことになっていることを除いて、実質的に同じWCFサービスコードがいくつかあります。

[ServiceContract]
public interface IRestServiceImpl
{
    [OperationContract]
    [WebInvoke(Method = "GET",
        ResponseFormat = WebMessageFormat.Xml,
        BodyStyle = WebMessageBodyStyle.Wrapped,
        UriTemplate = "xml/{id}")]
    string XMLData(string id);

    [OperationContract]
    [WebInvoke(Method = "GET",
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Wrapped,
        UriTemplate = "json/{id}")]
    string JSONData(string id);
}

xmlは正常に機能します(たとえば、ブラウザーに「http:// localhost:4841 / RestServiceImpl.svc / xml / 2468」と入力すると)。

ただし、「http:// localhost:4841 / RestServiceImpl.svc / json / 2468」と入力すると、「ファイルのダウンロード-セキュリティの警告」ダイアログが表示され、ファイル(この場合は「2468」という名前)を保存できます。 、メモ帳で開いたときに次のものが含まれます。

{"JSONDataResult":"製品2468をリクエストしました"}

これは「設計どおり」(jsonの結果をファイルに保存するため)ですか、それともxml-o-ramaと同じように機能しないのですか?

4

2 に答える 2

5

特定のコンテンツタイプを処理する方法を決定するのはブラウザ次第であり、ブラウザはJSONをどう処理するかを知らないようです。

これを確認するには、Chrome Dev ConsoleまたはFirebug(または使用しているブラウザで同等のもの)を使用しているときに、そのリソースを読み込むときにネットワークリクエストを確認します。ヘッダーには、次のようなものが表示されます。

Content-type: application/json

もしそうなら、問題はあなたのブラウザです。それが表示されない場合は、サーバーまたはサービスのコードが間違っています(特に、「わからないapplication/octet-stream」と同等のmimeタイプの場合)。

ブラウザに関しては、個人的にはChrome +フォーマットされたJSON出力を表示するためのこの優れたプラグインをお勧めします:https ://github.com/callumlocke/json-formatter

于 2012-10-17T18:29:32.737 に答える
1

これは、サービスとの通信に使用するブラウザーによって異なります。IE(IE9まで)はXMLの表示方法を知っていますが、JSONは知りません。そのため、一方は表示されますが、もう一方は保存するように求められます(バイナリファイルを参照する場合と同じです)。Chromeは両方を表示する方法を知っているので、... / json/2468と.../xml / 2468の両方を参照すると、応答が表示されます。その1について行うべきサービスには何もありません。


1実際、関心があるのがブラウザに出力を表示することである場合(JSONまたはXMLを理解する必要のあるクライアントによるサービスを利用しない場合)、HTML形式のデータを返すこともできます。これを行う簡単な方法の1つは、以下に示すように、HTMLをストリームとして返すことです。

public class StackOverflow_12940785
{
    [ServiceContract]
    public interface IRestServiceImpl
    {
        [OperationContract]
        [WebGet(
            ResponseFormat = WebMessageFormat.Xml,
            BodyStyle = WebMessageBodyStyle.Wrapped,
            UriTemplate = "xml/{id}")]
        string XMLData(string id);

        [OperationContract]
        [WebGet(
            ResponseFormat = WebMessageFormat.Json,
            BodyStyle = WebMessageBodyStyle.Wrapped,
            UriTemplate = "json/{id}")]
        string JSONData(string id);

        [OperationContract]
        [WebGet(
            ResponseFormat = WebMessageFormat.Json,
            BodyStyle = WebMessageBodyStyle.Wrapped,
            UriTemplate = "html/{id}")]
        Stream HTMLData(string id);
    }
    public class Service : IRestServiceImpl
    {
        public string XMLData(string id)
        {
            return "You requested product " + id;
        }

        public string JSONData(string id)
        {
            return "You requested product " + id;
        }

        public Stream HTMLData(string id)
        {
            WebOperationContext.Current.OutgoingResponse.ContentType = "text/html";
            string response = @"<html>
                <head><title>My service</title></head>
                <body>
                    <p>You requested <b>product " + id + @"</b></p>
                </body>
            </html>";
            return new MemoryStream(Encoding.UTF8.GetBytes(response));
        }
    }
    public static void Test()
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        WebServiceHost host = new WebServiceHost(typeof(Service), new Uri(baseAddress));
        host.Open();
        Console.WriteLine("Host opened");

        Console.Write("Press ENTER to close the host");
        Console.ReadLine();
        host.Close();
    }
}
于 2012-10-17T18:29:43.080 に答える