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 回答