最近一直是成功地使IIS承载的WCF服务与基本身份验证一起工作。
因为成功地实现了这一点。我注意到财产价值没有被记住。
以下是一些代码:
[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();
}
}这是控制台和结果:
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。
点击这里下载。
我怎样才能让房产工作呢?
谢谢
发布于 2011-04-04 02:46:33
我从未见过WCF合同与属性一起使用来传输数据。即消息属性。AFAIK就是不可能。
我的建议是将合同中的关切事项分开,即业务和数据。
[ServiceContract]
public interface IEcho
{
[OperationContract]
string SendEcho(string Message);
}或
[ServiceContract]
public interface IEcho
{
[OperationContract]
string SendEcho(Message message);
}
[DataContract]
public class Message
{
[DataMember]
public string Message {get; set;}
}稍后,您可能希望更改Message对象。
[DataContract]
public class MessageV2 : Message
{
[DataMember]
public DateTime Sent {get; set;}
}虽然这会改变契约,但如果仔细管理,这样的更改可以向后兼容。
发布于 2011-04-04 06:26:58
要了解正在发生的事情,您需要知道如何配置连接到的服务对象的生存期。一个很好的起点是MSDN关于会话、实例和并发的文章。
例如,使用InstanceContextMode.PerCall,将为每个调用创建一个新的服务对象,因此在调用之间不会记住服务对象的属性。
在规模的另一端,InstanceContextMode.Single意味着一个实例在应用程序的生存期内处理所有客户端请求。在这种情况下,由一个客户端设置的属性对所有客户端都是可见的,通常是不可取的。
通常,我建议使用无状态服务对象。但是,如果您想要有状态的服务对象(例如,带有属性的对象),则应该使用InstanceContextMode.PerSession,并且(重要的)使用支持会话的绑定。
虽然我同意@JTew的观点,即您通常不应该将操作公开为属性,但如果您尝试使用另一种方式在调用之间存储状态的对象(例如私有字段),您将遇到同样的问题。例如,以下问题将完全相同:
[ServiceContract]
public interface IEcho
{
[OperationContract]
void SetMessage(string message);
[OperationContract]
string GetMessage();
... etc ...
}https://stackoverflow.com/questions/5533323
复制相似问题