2012-08-29 2 views
0

Silverlight 4 응용 프로그램 관련 문제. 이 응용 프로그램에서 모든 클라이언트 세션은 DLL을 호출하는 별도의 프로세스를 만듭니다.Silverlight-DLL 통신 문제

DLL과의 통신은 다음과 같은 호출 스택에서 수행됩니다 (두 가지 기능 : 하나는 작동하고 다른 하나는 작동하지 않음).

이 함수는 DLL (모두 잘 작동)에 있습니다

private delegate void DocRunExternPageBreakRectsDelegate(string docId, int DocNum, int PageNum); 

private delegate void DocRunExternPageDividionsDelegate(
    string docId, int DocNum, int PageNum, out int Vcols, out IntPtr VoutArray, out int Hcols, 
    out IntPtr HoutArray); 

...이 개 위임 인스턴스와 해당 기능 :

extern "C" BOOL __stdcall DocRunExternPageDividions(const char *docId, int num_form, int PageNum, int *Vcols, int **Vvalues, int *Hcols, int **Hvalues) 
{ 
    LOG_START_FUNCTION 
    BOOL res = 1; 
    __try { 
     res = DocRunExternPageDividions1(docId, num_form, PageNum, Vcols, Vvalues, Hcols, Hvalues); 
    } 
    __except(ExFilter(GetExceptionInformation())) 
    { 
     AfxThrowUserException(); 
    } 
    LOG_STOP_FUNCTION 
    return res; 
} 


extern "C" BOOL __stdcall DocRunExternPageBreakRects(const char *docId, int num_form, int PageNum) 
{ 
    LOG_START_FUNCTION 
     BOOL res = 1; 
    __try { 
     res = DocRunExternPageBreakRects1(docId, num_form, PageNum); 
    } 
    __except(ExFilter(GetExceptionInformation())) 
    { 
     AfxThrowUserException(); 
    } 
    LOG_STOP_FUNCTION 
     return res; 
} 

이 기능 서버를 호출하려면 두 대표가 있습니다 (서버 코드) :람다 표현식 내에서 -

public DocDividionsResult PageBreakRects(string docID, int DocNum, int pageNumber) { 
     var result = new DocDividionsResult(); 
     int[] vert; 
     int[] horz; 
     result.Data = new List<object> { Program.DllWrapper.PageBreakRects(docID, DocNum, pageNumber, out vert, out horz) }; 
     result.Vert = vert; 
     result.Horz = horz; 
     return result; 
    } 

    public DocDividionsResult GetPageDividions(string docID, int formId, int pageNumber) { 
     var result = new DocDividionsResult(); 
     int[] vert; 
     int[] horz; 
     result.Data = new List<object> 
         {Program.DllWrapper.GetPageDividions(docID, formId, pageNumber, out vert, out horz)}; 
     result.Vert = vert; 
     result.Horz = horz; 
     return result; 
    } 

다음 :

public bool GetPageDividions(string docID, int formId, int pageNumber, out int[] vert, out int[] horz) { 
     bool result = false; 
     int []localVert = null; 
     int []localHorz = null; 

     if (_wp != null) { 
      if (Service<IWPCommunication>.Use(TestService => 
      { 
       TestService.Test(UserId); 
      }, 
      WPService => 
      { 
       DocDividionsResult br = WPService.GetPageDividions(docID, formId, pageNumber); 
       if (br != null && br.Data != null && br.Data.Length == 1) 
       { 
        result = (bool)br.Data[0]; 
        localVert = br.Vert; 
        localHorz = br.Horz; 
       } 
      }, Id, FS) == 0) 
      { 
     ... 
       result = false; 
      } 
     } 
     vert = localVert; 
     horz = localHorz; 
     return result; 
    } 

    public bool PageBreakRects(string docId, int DocNum, int PageNum) { 
     bool result = false; 
     if (_wp != null) 
     { 
      if (Service<IWPCommunication>.Use(TestService => 
      { 
       TestService.Test(UserId); 
      }, 
      WPService => 
      { 
       DocDividionsResult br = WPService.PageBreakRects(docId, DocNum, PageNum); 
       if (br != null && br.Data != null && br.Data.Length == 1) { 
        result = (bool)br.Data[0]; 
       } 
      }, Id, FS) == 0) 
      { 
     ... 
       result = false; 
      } 
     } 
     return result; 
    } 

"사용"기능 (위에서 사용) :

public static int Use(UseServiceDelegate<T> codeTest, UseServiceDelegate<T> codeBlock, string SessionId, FileStream fs, bool throwException) { 
     IClientChannel texy = (IClientChannel)_testFactory.CreateChannel(new EndpointAddress("net.pipe://localhost/X2WPServiceUID" + SessionId)); 
     IClientChannel proxy = (IClientChannel)_channelFactory.CreateChannel(new EndpointAddress("net.pipe://localhost/X2WPServiceUID" + SessionId)); 
     int returnCode = 0; 
     try { 
      if (codeTest != null) { 
       codeTest((T)texy); 
       texy.Close(); 
      } 
      returnCode = 1; 
      if (codeBlock != null) { 
       codeBlock((T)proxy); 
       proxy.Close(); 
      } 
      returnCode = 2; 
     } catch(Exception e) { 
      if (returnCode == 1 && throwException) 
       throw e; 
     } finally { 
      if (returnCode == 0 && codeTest != null) 
       texy.Abort(); 
      else if (returnCode == 1 && codeBlock != null) 
       proxy.Abort(); 
     } 
     return returnCode; 
    } 
-
public bool PageBreakRects(string docId, int DocNum, int PageNum, out int[] vert, out int[] horz) { 
     bool result; 
     vert = null; 
     horz = null; 
     Program.WriteUserMessage("Called PageBreakRects(" + docId + ", " + DocNum + ", " + PageNum + ")"); 
     try { 
      DocRunExternPageBreakRects(docId, DocNum, PageNum); 
      DocRunExternPageDividions(docId, 0, PageNum, out vert, out horz); 
      result = true; 
     } catch (Exception ex) {} 
     return result; 
    } 

    public bool GetPageDividions(string docID, int Id, int pageNumber, out int[] vert, out int[] horz) { 
     bool result = false; 
     vert = null; 
     horz = null; 
     try { 
      DocRunExternPageDividions(docID, Id, pageNumber, out vert, out horz); 
      result = true; 
     } catch (Exception) {} 
     return result; 
    } 

그들 각각을 여기라고

예외가 발생하면 클라이언트 통신이 생략됩니다. 전자 서버 쪽. GetPageDividions 함수가 정상적으로 작동합니다. PageBreakRects가 아니라 : DocDividionsResult br = WPService.PageBreakRects (docId, DocNum, PageNum); ; DocDividionsResult BR = WPService.PageBreakRects (DOCID, DocNum, PageNum)

"The message with Action 'http://tempuri.org/IWPCommunication/PageBreakRects' 
cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. 
This may be because of either a contract mismatch (mismatched Actions between sender and receiver) 
or a binding/security mismatch between the sender and the receiver. 
Check that sender and receiver have the same contract and the same binding 
(including security requirements, e.g. Message, Transport, None)." 

악화 대한 언급이 경우 함수 PageBreakRects 바꿀 것을이다 다음과 같은 예외가 발생 with DocDividionsResult br = WPService.GetPageDividions (docID, formId, pageNumber); 예외가 발생하지 않습니다.

답변

1

처음부터 시작했는지 여부는 확실하지 않지만 게시 한 코드 중 오류가 발생하지 않았 으면합니다. 이 오류는 웹 설정의 system.serviceModel 섹션에 오류가 있기 때문에 클라이언트 (실버 라이트)에서 웹 서비스를 호출하는 데 문제가 있음을 의미합니다. 서비스 참조를 새로 고침만으로 문제를 해결할 수 있습니다.

응용 프로그램을 Visual Studio에서 로컬로 실행하고 서비스 참조를 서버에 설치된 서비스로 지정하십시오 (서비스 참조를 마우스 오른쪽 단추로 클릭하고 서비스 참조 구성을 선택한 다음 서버의 서비스 위치에 맞게 URl을 변경하십시오.). 이 구성에서 이미 개발/테스트중인 경우 서비스 참조를 마우스 오른쪽 단추로 클릭하고 "서비스 참조 업데이트"를 선택하십시오.