Wcf Silverlight DLL通信问题

Wcf Silverlight DLL通信问题,wcf,silverlight,Wcf,Silverlight,Silverlight 4应用程序存在问题。 在此应用程序中,每个客户端会话都创建一个单独的进程,该进程调用DLL 与DLL的通信构建在以下调用堆栈中(对于两个函数:一个正常工作,另一个不正常) DLL中有2个函数(都可以正常工作): 要调用此函数,服务器有两个委托: private delegate void DocRunExternPageBreakRectsDelegate(string docId, int DocNum, int PageNum); private delegate

Silverlight 4应用程序存在问题。 在此应用程序中,每个客户端会话都创建一个单独的进程,该进程调用DLL

与DLL的通信构建在以下调用堆栈中(对于两个函数:一个正常工作,另一个不正常)

DLL中有2个函数(都可以正常工作):

要调用此函数,服务器有两个委托:

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);
。。。两个委托实例和相应的函数:

    private DocRunExternPageBreakRectsDelegate DocRunExternPageBreakRectsD;
                DocRunExternPageBreakRectsD =
                Marshal.GetDelegateForFunctionPointer(ptrDocRunExternPageBreakRects,
                                                      typeof (DocRunExternPageBreakRectsDelegate)) as
                DocRunExternPageBreakRectsDelegate;

    private DocRunExternPageDividionsDelegate DocRunExternPageDividionsD;
                DocRunExternPageDividionsD =
                Marshal.GetDelegateForFunctionPointer(ptrDocRunExternPageDividionsD,
                                                      typeof (DocRunExternPageDividionsDelegate)) as
                DocRunExternPageDividionsDelegate;

    public void DocRunExternPageDividions(string docId, int DocNum, int PageNum, out int[] vert, out int[] horz) {
        IntPtr VoutArray, HoutArray;
        int vcols, hcols;
        DocRunExternPageDividionsD(docId, DocNum, PageNum, out vcols, out VoutArray, out hcols, out HoutArray);
        marshal(VoutArray, out vert, vcols);
        marshal(HoutArray, out horz, hcols);
    }

    public void DocRunExternPageBreakRects(string docId, int DocNum, int PageNum) {
        DocRunExternPageBreakRectsD(docId, DocNum, PageNum);
    }
这些函数中的每一个都在此处调用(服务器代码):

其中每一个都在这里被称为:

    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;
    }
更糟糕的是,如果函数中的PageBreakRects替换: DocDividionsResult br=WPService.PageBreakRects(docId、DocNum、PageNum); 具有 DocDividionsResult br=WPService.getPageDivitions(docID、formId、pageNumber);
然后不会引发异常。

不确定您是否从一开始就开始了,但我认为您发布的任何代码都不会导致错误。该错误意味着您在从客户端(silverlight)调用web服务时遇到问题,因为web配置中的system.serviceModel部分出错。您通常可以通过刷新服务引用来修复它

尝试在visual studio中本地运行该应用程序,并将服务引用指向您在服务器上安装的服务(右键单击该服务引用并选择“配置服务引用”,然后更改URl以与服务器上的服务位置相对应)。如果您已经在此配置中开发/测试,请尝试右键单击服务引用并选择“更新服务引用”

    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;
    }
    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;
    }
"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)."