There is problem with Session in Service, Session is null on second call (solved, see bottom of the post).
I have self-hosted server and client that makes calls to server via JsonServiceClient and ProtoBufServiceClient.
On start of client application I call:
var baseUrl = ConfigGlobal.Host ;
var client = new JsonServiceClient(baseUrl);
var authResponse = client.Post<AuthResponse>("/auth", new Auth
{
UserName = "test1",
Password = "password",
RememberMe = true
});
It works - OnAuthenticated it's fired in my CustomUserSession : AuthUserSession.
authService.SaveSession(session);
didn't help.
Then in one class:
var client = new ProtoBufServiceClient(ConfigGlobal.Host);
client.Put(new ExcelInitialize {Filename = ""}); // OK
Model = client.Get(...); // Session is null
There is a problem in service class in Get method Session is null. If I implement
public CustomUserSession CustomUserSession
{
get
{
return SessionAs<CustomUserSession>();
}
}
I'll get: Only ASP.NET Requests accessible via Singletons are supported.
My AppHost.cs
container.Register<ICacheClient>(new MemoryCacheClient());
container.Register<ISessionFactory>(c => new SessionFactory(c.Resolve<ICacheClient>()));
Plugins.Add(new AuthFeature(
() => new CustomUserSession(), new IAuthProvider[]
{
new CustomCredentialsAuthProvider(),
new BasicAuthProvider(),
}));
Plugins.Add(new RegistrationFeature());
Goal:
Send some variables from client and remember them on host until user logs off.
Edit:
My Workflow looks like this:
SomeClass1:
- new auth service client->Post(new Auth(...)); // login ok
- nothing more
SomeClass2:
- new service client->Put(new E); // some init.
- service client->Get(new G);
Service G:
- on G request new service client TryResolve();
- client->Get(new W)
Service E
- on E request CustomUserSession accessible
- on W request CustomUserSession not accessible.
My Custom* classes looks like in Scott answer.
Edit:
Here is the code of my problem ready to copy&paste:
private static void Main(string[] args)
{
// Very basic console host
var appHost = new AppHost();
appHost.Init();
appHost.Start("http://*:8082/");
var url = "http://localhost:8082";
var foo = new TestApp.SomeClass1(url);
var bar = new TestApp.SomeClass2(url);
Console.ReadKey();
}
public class AppService : Service
{
public CustomUserSession CustomUserSession
{
get
{
// Returns the typed session
return SessionAs<CustomUserSession>();
}
}
}
public class GService : AppService
{
public object Get(GRequest request)
{
var client = base.TryResolve<EService>();
client.Get(new WRequest());
return new { CustomUserSession.SuperHeroIdentity };
}
}
public class EService : AppService
{
public void Get(WRequest wRequest)
{
Console.WriteLine(CustomUserSession.SuperHeroIdentity);
}
public void Get(ERequest request)
{
Console.WriteLine(CustomUserSession.SuperHeroIdentity);
}
public void Put(ERequest request)
{
Console.WriteLine(CustomUserSession.SuperHeroIdentity);
}
}
public class SomeClass1
{
public SomeClass1(string url)
{
var client = new JsonServiceClient(url);
client.Post<AuthResponse>("/auth", new Auth
{
UserName = "clark.kent",
Password = "kryptonite",
RememberMe = true
});
}
}
public class SomeClass2
{
public SomeClass2(string url)
{
var client = new JsonServiceClient(url);
client.Put(new ERequest());
client.Get(new GRequest());
}
}
public class GRequest : IReturnVoid
{
}
public class ERequest : IReturnVoid
{
}
public class WRequest : IReturnVoid
{
}
Solution (for this problem):
- Save session cookies in client application and restore them before every call to Webservice.
- Use Service::Resolve() instead of Service::TryResolve
The code you have posted looks okay to me. So it's likely something trivial with your setup.
I have created a simple, self hosted app which also uses a
CustomUserSessionand aCustomCredentialsAuthProvider, hopefully using this as a guide will highlight what is going wrong. Let me know how you get on.If you put this
index.htmlin yourbinfolder and navigate tohttp://localhost:8082/index.htmlyou can call the service, to test it.Update:
Having looked at your usage code provided in your edit. You are calling the Auth method in
SomeClass1and then thatJsonServiceClientisn't reused. So your session won't follow. You have to reuse the client, because the client stores the cookies that track your session.In
SomeClass2you are effectively calling the service without authenticating, so the session isnull. You need to reuse the sameJsonServiceClientfor your requests.You could run your authentication method and then pass the session cookies to any subsequent
JsonServiceClient, to save re-authenticating with each client. It's easy to do:You are also trying to resolve another service within your service using:
You need to use this instead, or you will see the
Only ASP.NET Requests accessible via Singletons are supportedexception: