0

JSON/JSONP を返す必要がある WCF 4.5 サービスがあります。を使用してこれを行うことができますが、すべてのオブジェクトWebScriptServiceHostFactoryに特別なプロパティが追加__typeされ、応答がオブジェクトにラップされ{d:{...}}ます。私はそれをしたくありません。

を使用してそれを取り除くことができますがWebServiceHostFactory、JSONP はサポートされていません。

WCF からきれいな JSONP 出力を得るにはどうすればよいですか?

4

2 に答える 2

0

関数/メソッドにこれらの属性がありますか?

<OperationContract()> _
<WebGet(UriTemplate:="GetJobDetails?inpt={inpt}", BodyStyle:=WebMessageBodyStyle.Wrapped,
        RequestFormat:=WebMessageFormat.Json, ResponseFormat:=WebMessageFormat.Json)>
于 2013-01-11T17:09:42.957 に答える
0

webHttpBinding で JSONP を使用できるようにするには、いくつかのオプションがあります。

を使用する場合は、そのファクトリによって作成されたデフォルトエンドポイントのプロパティWebServiceHostFactoryのデフォルト値を変更できます。これは、以下のセクションを構成に追加することで実行できます。crossDomainScriptAccessEnabled

<system.serviceModel>
    <standardEndpoints>
        <webHttpEndpoint>
            <standardEndpoint crossDomainScriptAccessEnabled="true"
                              defaultOutgoingResponseFormat="Json"/>
        </webHttpEndpoint>
    </standardEndpoints>
</system.serviceModel>

アプリケーション内のすべてのWeb サービス ホストのデフォルトを変更したくない場合は、アプリケーションのみを変更できます。別の方法として、必要に応じてエンドポイントを設定するカスタム サービス ホスト ファクトリを使用する方法があります。

    public class MyFactory : ServiceHostFactory
    {
        protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
        {
            return new MyServiceHost(serviceType, baseAddresses);
        }

        class MyServiceHost : ServiceHost
        {
            public MyServiceHost(Type serviceType, Uri[] baseAddresses)
                : base(serviceType, baseAddresses)
            {
            }

            protected override void OnOpening()
            {
                // this assumes the service contract is the same as the service type
                // (i.e., the [ServiceContract] attribute is applied to the class itself;
                // if this is not the case, change the type below.
                var contractType = this.Description.ServiceType;
                WebHttpBinding binding = new WebHttpBinding();
                binding.CrossDomainScriptAccessEnabled = true;
                var endpoint = this.AddServiceEndpoint(contractType, binding, "");
                var behavior = new WebHttpBehavior();
                behavior.DefaultOutgoingResponseFormat = WebMessageFormat.Json;
                endpoint.Behaviors.Add(behavior);
            }
        }
    }

さらに別の方法として、構成を介してエンドポイントを定義することもできます。

<system.serviceModel>
    <services>
        <service name="StackOverflow_14280814.MyService">
            <endpoint address=""
                      binding="webHttpBinding"
                      bindingConfiguration="withJsonp"
                      behaviorConfiguration="web"
                      contract="StackOverflow_14280814.MyService" />
        </service>
    </services>
    <bindings>
        <webHttpBinding>
            <binding name="withJsonp" crossDomainScriptAccessEnabled="true" />
        </webHttpBinding>
    </bindings>
    <behaviors>
        <endpointBehaviors>
            <behavior name="web">
                <webHttp/>
            </behavior>
        </endpointBehaviors>
    </behaviors>
</system.serviceModel>
于 2013-01-11T18:12:37.433 に答える