【发布时间】:2011-12-19 22:33:46
【问题描述】:
我正在使用 Microsoft 提供的 JSONP 示例。 http://msdn.microsoft.com/en-us/library/cc716898(v=vs.90).aspx
JSONPEncoderFactory JSONPBindingExtension JSONPBindingElement JSONP行为
一切正常,除了返回 null 时。 而不是我想要的,那就是:callback(null); 它返回一个空白文档,这会导致大多数 JSONP 框架出现错误,例如
jQuery.ajax({jsonp:"callback"});
我在自定义类中的每个方法调用以及完成所有工作的方法调用上都设置了断点:
public override ArraySegment<byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset)
我找到解决方案的最接近的方法只是猜测。我想也许 WebServiceHost 类可能有一个我可以重写的方法来构建我期望的功能,但到目前为止我空手而归。
我还想提一下,由于以下问题,我没有使用 WebScriptServiceHostFactory 类:
Endpoints using 'UriTemplate' cannot be used with 'System.ServiceModel.Description.WebScriptEnablingBehavior'.
如果我使用这个工厂,返回 null 会导致我正在寻找的功能。但是,我不能使用 TemplateUri,而我正在使用它们进行 HMAC 加密。由于我不能在 JSONP 请求中使用标头,因此格式为
/Service/Action/publicKey-signature?params
我尝试通过 JSONP 类型请求找到 HMAC 标准,但找不到任何东西。这是我能想到的最干净的。使用参数作为签名。
更新:
我在尝试以下解决方案时缺少的东西是您必须确保在您的 web.config 上构建一个具有 crossDomainScriptAccessEnabled="true" 的 webHttpBinding。此外,您必须确保不使用该行为。也不要使用 WebScriptServiceHostFactory。 您可以使用 WebServiceHostFactory,但您必须在 web.config 中使用它(或通过绑定为单个服务执行此操作):
<system.serviceModel>
<standardEndpoints>
<webHttpEndpoint>
<standardEndpoint crossDomainScriptAccessEnabled="true" />
</webHttpEndpoint>
</standardEndpoints>
</system.serviceModel>
【问题讨论】:
-
您使用的是 .NET Framework 3.5 还是 4.0?在 4.0 中,JSONP 支持内置在类中,因此您不需要像示例中所示的编码器。
-
我使用的是 4.0.我解释了当您尝试将 JSONP 与内置类一起使用时会发生什么。您不能使用 TemplateUri。除非你有办法允许吗?