首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WCF OperationContract属性忘记值

WCF OperationContract属性忘记值
EN

Stack Overflow用户
提问于 2011-04-03 23:48:00
回答 2查看 2.5K关注 0票数 2

最近一直是成功地使IIS承载的WCF服务与基本身份验证一起工作

因为成功地实现了这一点。我注意到财产价值没有被记住。

以下是一些代码:

代码语言:javascript
复制
[ServiceContract]
public interface IEcho
{
    string Message { [OperationContract]get; [OperationContract]set; }
    [OperationContract]
    string SendEcho();
}

public class EchoProxy : IEcho
{
    public string Message { get; set; }
    public string SendEcho()
    {
        return string.Concat("You said: ", Message);
    }
}
public class EchoService : System.ServiceModel.ClientBase<IEcho>, IEcho
{
    //-- ..... CONSTRUCTORS OMITTED ....

    public string Message
    {
        get { return base.Channel.Message; }
        set { base.Channel.Message = value; }
    }
    public string SendEcho()
    {
        return base.Channel.SendEcho();
    }
}

这是控制台和结果:

代码语言:javascript
复制
EchoService client = new EchoService("SecureEndpoint");
client.ClientCredentials.UserName.UserName = "test";
client.ClientCredentials.UserName.Password = "P@ssword1";
client.Message = "Hello World";
Console.WriteLine(client.SendEcho());

预期结果:You said: Hello World

You said: 实际结果:

我已经把沙箱项目上传到我的skydrive上了。我在API项目中包含了一个SETUP.txt。

点击这里下载。

我怎样才能让房产工作呢?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-04 02:46:33

我从未见过WCF合同与属性一起使用来传输数据。即消息属性。AFAIK就是不可能。

我的建议是将合同中的关切事项分开,即业务和数据。

代码语言:javascript
复制
[ServiceContract]
public interface IEcho
{
    [OperationContract]
    string SendEcho(string Message);
}

代码语言:javascript
复制
[ServiceContract]
public interface IEcho
{
    [OperationContract]
    string SendEcho(Message message);
}

[DataContract]
public class Message
{
    [DataMember]
    public string Message {get; set;}
}

稍后,您可能希望更改Message对象。

代码语言:javascript
复制
[DataContract]
public class MessageV2 : Message
{
    [DataMember]
    public DateTime Sent {get; set;}
}

虽然这会改变契约,但如果仔细管理,这样的更改可以向后兼容。

票数 3
EN

Stack Overflow用户

发布于 2011-04-04 06:26:58

要了解正在发生的事情,您需要知道如何配置连接到的服务对象的生存期。一个很好的起点是MSDN关于会话、实例和并发的文章

例如,使用InstanceContextMode.PerCall,将为每个调用创建一个新的服务对象,因此在调用之间不会记住服务对象的属性。

在规模的另一端,InstanceContextMode.Single意味着一个实例在应用程序的生存期内处理所有客户端请求。在这种情况下,由一个客户端设置的属性对所有客户端都是可见的,通常是不可取的。

通常,我建议使用无状态服务对象。但是,如果您想要有状态的服务对象(例如,带有属性的对象),则应该使用InstanceContextMode.PerSession,并且(重要的)使用支持会话的绑定。

虽然我同意@JTew的观点,即您通常不应该将操作公开为属性,但如果您尝试使用另一种方式在调用之间存储状态的对象(例如私有字段),您将遇到同样的问题。例如,以下问题将完全相同:

代码语言:javascript
复制
[ServiceContract]
public interface IEcho
{
    [OperationContract]
    void SetMessage(string message);

    [OperationContract]
    string GetMessage();

    ... etc ...
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5533323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档