私の質問は、JSONPで応答するIIS用のWCF RESTサービスを中心にしています。私はこの解決策のクラスを取った:http://msdn.microsoft.com/en-us/library/cc716898.aspxそして私のものにそれらを加えた。 httpTransportで偽装を使用して開発者ワークステーションで問題なく動作していましたが、開発サーバーに移動しようとしたときにセキュリティ上の問題が発生しました。これらの問題は、以下の設定とApp Pool IDユーザーを使用して解決されました。また、SPNを作成するためのアクセス権がないため、NTLMのみの認証用にIISメタベースファイルを構成しています(IIS 6を使用していますが、すぐにIIS 7になります。私は現在の設定が私のセキュリティ問題を解決したと考えていますが、私のJSONPレスポンスはregualar JSONにダウングレードされましたが、これは問題です。ここでは、関連する設定されていますWCFカスタムJSONPバインディングとhttpsTransport
<services>
<service name="IS.Core.Infrastructure.RESTRouter.Transactions" behaviorConfiguration="">
<endpoint address="" behaviorConfiguration="webHttp" binding="customBinding"
bindingConfiguration="jsonpBinding" contract="IS.Core.Infrastructure.RESTRouter.ITransactions">
</endpoint>
</service>
<service name="IS.Core.Infrastructure.RESTRouter.Queue" behaviorConfiguration="">
<endpoint address="" behaviorConfiguration="webHttp" binding="customBinding"
bindingConfiguration="jsonpBinding" contract="IS.Core.Infrastructure.RESTRouter.IQueue" />
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="webHttp">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<customBinding>
<binding name="jsonpBinding">
<jsonpMessageEncoding />
<httpsTransport
manualAddressing="true"
authenticationScheme="Ntlm" />
</binding>
</customBinding>
</bindings>
<extensions>
<bindingElementExtensions>
<add name="jsonpMessageEncoding"
type="IS.Core.Infrastructure.RESTRouter.JsonpBindingExtension, RESTRouter, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bindingElementExtensions>
</extensions>
ここでは、インターフェイスメソッド定義の1つである:ここで
[OperationContract]
[WebGet(UriTemplate = "{ModelPath}/{ObjectTypeName}?callback={callback}", ResponseFormat = WebMessageFormat.Json)]
[JSONPBehavior(callback = "callback")]
JSONPXml NewObject(string ModelPath, string ObjectTypeName, string callback);
はその実装です:
[OperationBehavior(Impersonation = ImpersonationOption.Allowed)]
public JSONPXml NewObject(string ModelPath, string ObjectTypeName, string callback) {
int val = getEmployeeIdByNTUsername(OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name);
JSONPXml jsp = null;
EntityPluginReflectorClient client = null;
try {
client = new EntityPluginReflectorClient();
string output = client.NewObject(ModelPath, ObjectTypeName);
jsp = new JSONPXml() { xml = output };
} catch (Exception e) {
InfrastructureLog.WriteException(this, "NewObject", e);
jsp = getExceptionResponse(e);
}
finally {
client.Close();
}
return (jsp);
}
、ここでは、データコントラクトです:
[DataContract()]
public class JSONPXml {
public JSONPXml() { }
[DataMember]
public string xml;
}
詳しい情報が必要な場合はお知らせください。ありがとうございました。
ありがとう、あなたのコメントの後に私は二重チェックを行い、コールバッククエリのparamは両方の環境に存在します。私のローカルシステムでは、configをhttpTransportからHttpsTransportに変更すると、出力は通常のjsonになります。 –
奇妙な。あなたは、サンプルのクラスを含めたと言いました。 JSONPEncoderFactoryの両方のWriteMessageメソッドにブレークポイントを設定すると、呼び出し時にヒットしたものがありますか? –