Moje pytanie dotyczy usługi WCF REST dla usług IIS, która odpowiada za pomocą JSONP. Wziąłem klasy w tym rozwiązaniu: http://msdn.microsoft.com/en-us/library/cc716898.aspx i dodałem je do mojego. Wszystko działało dobrze na mojej stacji roboczej programistów, podszywając się pod httpTransport, ale kiedy próbowałem przenieść się na serwer programistyczny, natknąłem się na pewne problemy z bezpieczeństwem. Problemy te zostały rozwiązane za pomocą poniższej konfiguracji i użytkownika tożsamości puli aplikacji. Również konfiguruję plik metabazy IIS dla uwierzytelniania tylko NTLM (używamy IIS 6, ale wkrótce będzie IIS 7, musi działać na obu), ponieważ nie mam dostępu do tworzenia nazwy SPN. Wierzę, że obecna konfiguracja rozwiązała moje problemy z zabezpieczeniami , ale w procesie moja odpowiedź JSONP została obniżona do regualar JSON, to jest problem. Oto właściwa konfiguracja:WCF Niestandardowe powiązanie JSONP i https Transport
<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>
Oto jedna z definicji metody interfejsu:
[OperationContract]
[WebGet(UriTemplate = "{ModelPath}/{ObjectTypeName}?callback={callback}", ResponseFormat = WebMessageFormat.Json)]
[JSONPBehavior(callback = "callback")]
JSONPXml NewObject(string ModelPath, string ObjectTypeName, string callback);
tutaj jest jego realizacja:
[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);
}
i tutaj jest umowa dane:
[DataContract()]
public class JSONPXml {
public JSONPXml() { }
[DataMember]
public string xml;
}
Proszę dać mi znać, jeśli potrzebne są dodatkowe informacje i dzięki za rozpatrzenie tego.
Dzięki, po twoim komentarzu zrobiłem podwójne sprawdzenie, a parametr zapytania zwrotnego jest obecny w obu środowiskach. Należy pamiętać, że w moim lokalnym systemie, kiedy zmieniam konfigurację z httpTransport na HttpsTransport, wyjście staje się regularnym jsonem. –
Dziwne. Powiedziałeś, że uwzględniłeś klasy z próbki. Jeśli umieścisz punkt przerwania w obu metodach WriteMessage w JSONPEncoderFactory, czy którykolwiek z nich zostanie trafiony podczas wykonywania połączenia? –