silverlight   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了客户端WCF DataContract具有来自服务的空/空值大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我有一个简单的WCF服务,从服务器返回时间.我已经确认通过与Fiddler进行检查来发送数据.这是我的服务发送的结果对象xml. <s:Envelope xmlns:s="http://scheR_440_11845@as.xmlsoap.org/soap/envelope/"> <s:Body> <GetTimeResponse xmlns="http://tempuri.org/">
@H_696_18@ 我有一个简单的WCF服务,从服务器返回时间.我已经确认通过与fiddler进行检查来发送数据.这是我的服务发送的结果对象xml.

<s:Envelope xmlns:s="http://scheR_440_11845@as.xmlsoap.org/soap/envelope/">
     <s:Body>
        <GetTimeResponse xmlns="http://tempuri.org/">
            <GetTimeResult xmlns:a="http://scheR_440_11845@as.datacontract.org/2004/07/Testservice.DataObjects" xmlns:i="http://www.w3.org/2001/XMLscheR_440_11845@a-instance">
                <a:theTime>2010-03-26T09:14:38.066372-06:00</a:theTime>
            </GetTimeResult>
        </GetTimeResponse>
     </s:Body>
   </s:Envelope>

所以,据我所知,服务器端没有任何错误.它正在接收请求并返回结果.

但是在我的silverlight客户端上,返回对象的所有成员都是null,空白或认的vaule.您可以看到服务器返回当前日期和时间.但在silverlight中,我的对象的time属性设置为1/1/0001 12:00 AM(认值).

在DataContracts与服务器和silverlight客户端之间不匹配的Sooo表示.这是服务器的DataContract

[DataContract]
 public class Time
 {
  [DataMember]
  public datetiR_440_11845@e theTime { get; set; }
 }

难以置信的简单这是我的silverlight客户端上的datacontract.

[DataContract]
 public class Time
 {
  [DataMember]
  public datetiR_440_11845@e theTime { get; set; }
 }

字面上唯一的区别是应用程序中的命名空间.但是,返回的值仍然为null,为空或.NET认值.

感谢您的帮助!

updatE

这是我所有的服务都通过的ClientBase.我读了一个excellent article here来构造它.

public class ClientBase<T> where T :class 
{
    private T ChAnnel { get; set; }

    private Type ContractType { get; set; }

    private ClientBase()
    {
        ContractType = typeof( T );
    }

    public ClientBase(String endPointConfiguration) :this()
    {
        ChAnnel = new ChAnnelFactory<T>( endPointConfiguration ).CreateChAnnel();
    }

    public ClientBase( EndpointAddress address,Binding binding ):this()
    {
        ChAnnel = new ChAnnelFactory<T>( binding,address ).CreateChAnnel();
    }

    public void Begin(String methodName,object state,params object[] parameterArray)
    {
        Begin( methodName,null,state,parameterArray );
    }

    public void Begin(String methodName,EventHandler<ClientEventArgs> callBACk,params object[] parameterArray)
    {
        if(parameterArray != null)
        {
            Array.Resize(ref parameterArray,parameterArray.Length + 2);
        }
        else
        {
            parameterArray = new object[2];
        }

        parameterArraY[ parameterArray.Length - 1 ] = new ObjectClientState {CallBACk = callBACk,MethodName = methodName,UserState = statE};
        parameterArraY[ parameterArray.Length - 2 ] = new AsyncCallBACk( OnCallBACk );
        ContractType.InvokeMember( "Begin" + methodName,System.Reflection.bindingFlags.Instance | System.Reflection.bindingFlags.InvokeMethod |
                                   System.Reflection.bindingFlags.Public,ChAnnel,parameterArray );

    }

    private void OnCallBACk(IAsyncResult result)
    {
        ObjectClientState state = result.AsyncState as ObjectClientState;
        if(state == null)
            return;
        Object obj = ContractType.InvokeMember( "End" + state.MethodName,System.Reflection.bindingFlags.Instance | System.Reflection.bindingFlags.InvokeMethod |
                                                System.Reflection.bindingFlags.Public,new object[] {result} );
        if(state.CallBACk != null)
        {
            state.CallBACk( this,new ClientEventArgs {Object = obj,UserState = state.UserStatE} );
        }
    }

    public class ClientEventArgs : EventArgs
    {
        public object Object { get; set; }
        public object UserState { get; set; }

        public T LoadResult<T>()
        {
            if( Object is T )
                return ( T ) Object;
            return default( T );
        }
    }

    private class ObjectClientState
    {
        public EventHandler<ClientEventArgs> CallBACk { get; set; }
        public String MethodName { get; set; }
        public object UserState { get; set; }
    }
}

这是我的界面

[serviceContract]      

    public interface ITestservice
            {

                [OperationContract( AsyncPattern = true )]
                IAsyncResult BeginGetTime( AsyncCallBACk callBACk,object state );

                Time EndGetTime( IAsyncResult result );

            }

现在我有我的服务类,通过我的Baseservice类使用这个接口进行调用.

public class TestSiteservice : ClientBase<ITestservice>
{
    public TestSiteservice (String endPointConfiguration):base(endPointConfiguration) { }

    public TestSiteservice ( EndpointAddress address,Binding binding ) : base( address,binding ) { }

    public void GetTime( EventHandler<ClientEventArgs> callBACk )
    {
        Begin( "GetTime",callBACk,null );
    }
}

最后,这里是实际调用所有内容并进行工作的代码.

TestSiteservice client = new TestSiteservice ( new EndpointAddress( "http://localhost:3483/wcf/service.svc" ),new BasichttpBinding() );

client.GetTime( delegate( object res,ClientBase<ITestservice>.ClientEventArgs e )
            {

                Dispatcher.beginInvoke( () => lblDisplay.Text = "Welcome " + e.LoadResult<Time>().theTime );

            } );

我希望没有人丢失所有这代码我发布:P

解决方法

因为您没有在DataContractAttribute上设置 the Namespace property,所以命名空间将从.NET类/命名空间进行协调.您可以在发布的SOAP消息示例中看到此信息:

http://schemas.datacontract.org/2004/07/Testservice.DataObjects

为了使合同被视为相等,您必须将DataContract上的Namespace属性设置为两边的相同值.这可能看起来像这样一些东西:

[DataContract(Namespace="urn:my-test-namespace")]

大佬总结

以上是大佬教程为你收集整理的客户端WCF DataContract具有来自服务的空/空值全部内容,希望文章能够帮你解决客户端WCF DataContract具有来自服务的空/空值所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。