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>