문제

제공된 .dll 또는 SOAP와 함께 웹 서비스에 연결하려는 Silverlight 3 응용 프로그램을 개발하고 있습니다. 그러나 .dll은 Silverlight에 적합하지 않으므로 그렇게 할 수 없습니다. 그리고 크로스 도메인 문제로 인해 SOAP 서비스에 액세스 할 수 없습니다 (클라이언트 정책 XML은 수행하지 않으므로 호스팅하지 않습니다).

따라서 내 솔루션은 내 도메인의 WCF 활성화 웹 서비스에 .dll을 포함하고 Silverlight 응용 프로그램이 웹 서비스를 호출하도록합니다. 이것은 작동합니다.

이제 내 문제에 : 내 웹 서비스에서 참조 된 .dll에서 제공 한 클라이언트에는 .connect () 메소드가 있으므로 객체의 상태를 저장해야합니다. 하지만 그렇게 할 수 있습니까? Silverlight가 WSHTTPBinding을 지원하지 않기 때문에 프로 버리건. ASP 세션 변수에 액세스 할 수 있다는 것을 알고 있지만 브라우저 외에도 할 수 있습니까? 내 문제에 대한 하나의 솔루션 만 파악할 수 있으며 이는 ASP 세션에서 사용자 이름/비밀번호를 저장하고 각 메소드에서 .connect () 메소드를 호출하는 것입니다. 그러나 그것은 실제로 나쁜 해결책입니다.

더 나은 아이디어?


나는 나 자신을 명확하게했다고 생각하지 않으며 그것에 대해 사과드립니다. 내 영어는 그 주요 원인입니다.

나는 가지고있다:

웹 사이트 및 브라우저에서 실행되는 내 실버 라이트 앱

동일한 도메인에서 호스팅되는 WCF 서비스.

크로스 도메인 웹 서비스 (크로스 도메인 정책 파일을 저장할 수 없습니다)

내 wcf webservice는 정책 파일없이 크로스 도메인 웹 서비스를 추가 할 수 없기 때문에 내 앱과 크로스 도메인 웹 서비스 사이에 계층을 제공합니다.

내 웹 서비스는 다음과 같습니다 (추상적 인 방식) :

class MyWebService
{
   CrossDomainWebServiceClient client = new CrossDomainWebServiceClient();

   public void Connect(string username, string password)
   {
      client.Connect(username, password);
   }

   public object Foo()
   {
      //GetEmployees() do only work if I'm connected
      return client.GetEmployees(); 
   }
}

foo () 메소드는 인스턴스 당 세션이 아닌 통화 당 세션이므로 작동하지 않습니다. 나는 이것이 작동하기를 원한다. 따라서 다음 호출을 위해 클라이언트 객체를 보존해야합니다. wshttpbinding은 분명히 지원되지 않기 때문에 Section.required는 Silverlight에서 작동하지 않습니다.

도움이 되었습니까?

해결책

나는 질문을 이해하는 100% 확신은 아니지만, 내가 함께 일하는 것과 다소 비슷한 상황을 가지고 있으며 여기에 우리가 그것을 처리하는 방법이 있습니다.

  1. 모든 데이터를 저장하는 타사 웹 서비스.
  2. WCF 중간 계층은 웹 서비스와의 모든 상호 작용을 처리하기 위해 우리가 생성했습니다.
  3. WCF 서비스에 연결되는 Silverlight 클라이언트 계층.

인증을 위해 WCF 서비스에 대한 인증 방법이 있으며 웹 서비스를 호출하고 Silverlight에서 수신 한 자격 증명을 전달합니다. 그런 다음 WebService는 Silverlight 요청에서 쿠키로 설정 한 인증 토큰으로 응답합니다. 따라서 Silverlight의 모든 미래 전화에는 웹 서비스에 호출 할 때마다 통과하는이 토큰이 포함됩니다.

분명히 사용자 이름과 비밀번호를 쿠키로 설정하고 싶지 않을 것입니다. 그러나 Webservice에서 쿠키 나 토큰을 다시 얻을 수 있으며 향후 요청에서 사용할 수 있기를 바랍니다.

업데이트 된 답변

업데이트 된 사양을 기반으로 서비스 클라이언트를 캐시 해야하는 것처럼 들립니다. 당신은 공상을 얻으려고 노력할 수 있습니다 사용자 정의 WCF 인스턴스 컨텍스트, 그러나 여기에 간단한 접근 방식이 있습니다.

[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class ProxyService
{
    private static Dictionary<Guid, DateTime> clients = new Dictionary<Guid, DateTime>();

    public ProxyService()
    {

    }

    [OperationContract]
    public void Login()
    {
        Guid id = Guid.NewGuid();
        // perform your login here
        clients.Add(id, DateTime.Now); // store your client instead of a date
        SetCookie(id);
    }

    [OperationContract]
    public DateTime Foo()
    {
        var id = ReadCookie();
        if (clients.ContainsKey(id))
        {
            return clients[id];
        }
        return DateTime.MinValue;
    }

    private void SetCookie(Guid id)
    {
        var cookie = new HttpCookie("id", id.ToString());
        cookie.Expires = DateTime.Now.AddMinutes(10);
        HttpContext.Current.Response.AppendCookie(cookie);
    }

    private Guid ReadCookie()
    {
        var cookie = HttpContext.Current.Request.Cookies.Get("id");
        if (cookie != null)
        {
            cookie.Expires = DateTime.Now.AddMinutes(10);
            return new Guid(cookie.Value);
        }
        return Guid.Empty;
    }
}

물론 DateTime 대신 고객 서비스를 저장합니다. 이제이 접근법에는 여전히 해결해야 할 몇 가지 문제가 있습니다.

  1. 타임 아웃 - 활성화되지 않은 세션을 타임 아웃하고 클라이언트 목록에서 정리할 수있는 방법이 필요합니다.
  2. 이것이 일을하는 매우 안전한 방법인지 확실하지 않습니다. 누군가가 당신의 안내를 얻었다면 그들은 직원에게 접근 할 수 있습니다. 그러나 나는 이것이 어떻게 일어날 지 알지 못하지만 보안 전문가는 아닙니다.

질문이 있으시면 지금은 알려주세요.

다른 팁

DLL이 Silverlight 3 런타임에 대해 구축되지 않은 경우 Silverlight 프로젝트에서 참조 할 수 없습니다. 고객에게 해당 런타임에 DLL을 재건하도록 요청하십시오.

Silverlight는 완전한 신뢰가 필요한 코드를 실행할 때 엄격합니다. Silverlight 애플리케이션이 DLL이 어떤 런타임에 있는지 모르는 경우,이를 수락하거나 전혀 전화하지 않습니다.

업데이트:

세션 수명 동안 서비스 객체를 메모리에 유지하도록 서비스를 표시 할 수 있습니다.

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
class MyWebService{   
    CrossDomainWebServiceClient client = new CrossDomainWebServiceClient();   

이렇게하면 크로스 도메인 클라이언트가 통화간에 초기화해야합니다.

원래 답변 :

실버 라이트 객체는 통화 사이에 살아있어 상태를 메모리로 유지할 수 있습니다.

Silverlight 응용 프로그램 실행 사이에 상태를 저장하려면 클라이언트 컴퓨터의 고립 된 스토리지로 상태를 직렬화하고 Silverlight 애플리케이션이 시작될 때 다시 읽을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top