SOAP 웹 서비스 집합에서 사용자는 사용자 지정 SOAP 헤더 (사용자 이름/암호)로 인증됩니다. 때마다 사용자가 다음과 같은 인증 방법을 인증하고 NHibernate에 세션에서 사용자 개체를 검색하기 위해 호출되는 WS 전화 :C#의 SOAP 및 NHibernate 세션
는 WS 작업 세션이 잘 정리되고 모든 작품 이루어집니다[...]
public Services : Base {
private User user;
[...]
public string myWS(string username, string password)
{
if(Auth(username, password)) { [...] }
}
}
public Base : WebService {
protected static ISessionFactory sesFactory;
protected static ISession session;
static Base {
Configuration conf = new Configuration();
[...]
sesFactory = conf.BuildSessionFactory();
}
private bool Auth(...) {
session = sesFactory.OpenSession();
MembershipUser user = null;
if (UserCredentials != null && Membership.ValidateUser(username, password))
{
luser = Membership.GetUser(username);
}
...
try {
user = (User)session.Get(typeof(User), luser.ProviderUserKey.ToString());
} catch {
user = null;
throw new [...]
}
return user != null;
}
}
: WSS에 생성, 수정 및 개체 변경 Nhibernate DB에 저장하십시오.
사용자 (동일한 사용자 이름/암호)가 다른 클라이언트 (기계)에서 동시에 동일한 WS를 호출 할 때 문제가 발생합니다. 저장된 개체의 상태가 일치하지 않습니다.
세션을 올바르게 관리하려면 어떻게해야합니까? 검색 한 및 NHibernate에서 세션 관리에 대한 설명서는 정말 광대합니다. 사용자 객체를 잠글까요? 동일한 사용자의 WS 호출간에 "세션 공유"관리를 설정해야합니까? 트랜잭션을 정통한 방법으로 사용해야합니까?
감사
갱신 1은
예, mSession는 '세션'입니다. 심지어 비 정적 세션으로 갱신 2
는 DB에 저장된 데이터가 일치하지 않는 객체.
try {
Auth([...]);
} catch {
// ....
}
var return_value = [...];
try {
using(ITransaction tx = session.Transaction)
{
tx.Begin();
MyType obj = new MyType();
user.field = user.field - obj.field; // The fields names are i.e. but this is actually what happens.
session.Save(user);
session.Save(obj);
tx.Commit();
return_value = obj.another_field;
}
} catch ([...]) {
// Handling exceptions...
} finally {
// Clean up
session.Flush();
session.Close();
}
return return_value;
모든 새로운 객체 (합니다 MyType)이 제대로 저장하지만 예상하는대로 user.field 상태가되지 않습니다 : 내가 삽입/개체를 저장하는 데 사용하는 패턴은 다음과 같다. obj.another_field도 정확합니다 (이 필드는 generated = on-save 정책이있는 ID 임).
'user.field = user.field - obj.field;
'이 (가) 더 많이 필요한 횟수만큼 실행됩니다.
이다 "mSession"와 "세션"같은 일? 나는 정적 인 것이 당신에게 어떤 문제를 일으킬 수 있다고 생각합니다. 실제로 많은 용도로 사용하기 위해 객체를 저장하는 코드를 볼 필요가 있습니다. – AlexCuse