L'utente corrente non cambia in WebService dopo che altri segnali utente
-
10-12-2019 - |
Domanda
Il contesto: Ho questo servizio Web ospitato in SharePoint.
.
[ServiceContract]
public interface IUserService
{
[WebInvoke(UriTemplate = "/GetCurrentUser", Method = "GET", BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json)]
[OperationContract]
string GetCurrentUser();
}
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class UserService: IUserService
{
public string GetCurrentUser()
{
return SPContext.Current.Web.CurrentUser.LoginName;
}
}
Il file di servizio corrispondente UserService.svc
è mappato sulla cartella ISAPI e sembra questo:
.
<%@ ServiceHost Factory="Microsoft.SharePoint.Client.Services.MultipleBaseAddressWebServiceHostFactory, Microsoft.SharePoint.Client.ServerRuntime, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
Language="C#" Debug="true"
Service="UserService, $SharePoint.Project.AssemblyFullName$" %>
Sto chiamando il servizio Web da una pagina di SharePoint tramite codice JavaScript.
.
function getCurrentUser() {
$.ajax({
type: 'GET',
url: 'http://server/sites/rootweb/_vti_bin/UserService.svc/GetCurrentUser',
success: function (data) {
printToDiv(data);
}
});
}
L'URL è codificato rigido solo per scopi demo.
Il problema: Supponiamo che l'utente A è colui che ha prima invocato la funzione JavaScript. Quindi il servizio restituisce il suo nome utente. Se dopo qualcun altro firma a SharePoint e chiama il servizio Web, allora otterrà il nome utente dell'utente. Se IE è chiuso e avviato nuovo e se l'utente c è colui che ha prima chiamato il servizio Web, il suo nome utente è sempre restituito. Non importa se l'utente A o l'utente B segni a Sharpoint. È somwhe che l'utente che ha chiamato il servizio web è memorizzato nella cache del servizio Web o del pezzo di codice JavaScript.
Cosa devo fare in modo che il servizio web restituisca il nome utente giusto?
Soluzione
It could be due to the browser caching the response of your AJAX request, IE loves this for example. Try adding: cache:false
to the AJAX request:
function getCurrentUser() {
$.ajax({
type: 'GET',
cache: false,
url: 'http://server/sites/rootweb/_vti_bin/UserService.svc/GetCurrentUser',
success: function (data) {
printToDiv(data);
}
});
}