Wir haben eine kleine Website mit Service Stack erstellt, haben jedoch ein Problem mit dem Hochladen von Benutzern. Wenn ein Benutzer eine Datei über einen POST hochlädt, wird die Sitzung geschlossen.Service-Stack-Sitzung nach dem Hochladen der Datei verloren
Die Größe der Datei scheint keine Rolle zu spielen, ebenso wenig wie die Verzögerung beim Hochladen des POST.
Ich habe bestätigt, dass der Browser immer noch die gleiche Session ID (SSID) -Cookie vor und nach dem Upload sendet.
Hier ist, wie wir AAA sind Handhabung:
public override void Configure(Container container)
{
//Config examples
//this.Plugins.Add(new PostmanFeature());
//this.Plugins.Add(new CorsFeature());
ServiceStack.Text.JsConfig.DateHandler = ServiceStack.Text.DateHandler.ISO8601;
Plugins.Add(new AuthFeature(() => new AuthUserSession(),
new IAuthProvider[] {
new FeedPartnerAuthProvider(), //Custom MSSQL based auth
}
));
//Global response filter to extend session automatically
this.GlobalResponseFilters.Add((req, res, requestDto) =>
{
var userSession = req.GetSession();
req.SaveSession(userSession, slidingExpiryTimeSpan);
});
this.Plugins.Add(new RazorFormat());
}
Hier ist, was die Upload-Code wie folgt aussieht:
//Upload Test Models
[Route("/upload", "POST")]
public class PostUpload : IReturn<PostUploadResponse>
{
public String Title { get; set; }
}
public class PostUploadResponse
{
public String Title { get; set; }
public Boolean Success { get; set; }
}
//Upload Test Service
[Authenticate]
public object Post(PostUpload request)
{
string uploadPath = "~/uploads";
Directory.CreateDirectory(uploadPath.MapAbsolutePath());
var customerFile = Request.Files.SingleOrDefault(uploadedFile =>
uploadedFile.ContentLength > 0 &&
uploadedFile.ContentLength <= 500 * 1000 * 1024);
if (customerFile == null)
throw new ArgumentException("Error: Uploaded file must be less than 500MB");
//determine the extension of the file
String inputFileExtension = "";
var regexResult = Regex.Match(customerFile.FileName, "^.*\\.(.{3})$");
if (regexResult.Success)
inputFileExtension = regexResult.Groups[1].Value;
if (inputFileExtension.Length == 0)
throw new Exception("Error determining extension of input filename.");
//build a temporary location on the disk for this file
String outputFilename = "{0}/{1}.{2}".FormatWith(uploadPath, Guid.NewGuid(), inputFileExtension).MapAbsolutePath();
if (File.Exists(outputFilename))
throw new Exception("Unable to create temporary file during upload.");
//Get some information from the session
String ownerId = "Partner_" + this.GetSession().UserAuthId;
//Write the temp file to the disk and begin creating the profile.
try
{
//Move the file to a working directory.
using (var outFile = File.OpenWrite(outputFilename))
{
customerFile.WriteTo(outFile);
}
}
catch (Exception ex)
{
throw new Exception("Error creating profile with uploaded file. ", ex);
}
finally
{
//Clean up temp file no matter what
try { File.Delete(outputFilename); }
catch (Exception delException) { }
}
return new PostUploadResponse
{
Title = request.Title,
Success = true
};
}
Die Datei hochgeladen, und die Antwort richtig zurück an den Browser weitergeleitet, aber nachfolgende Aufrufe an einen Dienst erhalten eine Umleiten an/Login, obwohl die richtige SS-ID und SP-PID als Teil der Anfrage übertragen werden.
Was verursacht die Beendigung meiner Benutzersitzung, wenn ich eine Datei hochlade?
Vielen Dank!
-Z
Können Sie die HTTP-Request/Response-Header sowohl der Datei-Upload und eine nachfolgende Anforderung, welche die 302 enthalten? – mythz