如果我有数百/数千台客户端计算机向我的服务器WCP,那么我应该用“200 OK”类型的消息作出响应,指明我已成功接收并将数据存储在数据库中吗?
这个功能是否已经集成到WCF中?
这个功能是否已经集成到WCF中?
这意味着一旦服务基础结构成功启动服务,您的客户端将继续执行,并且您将收到有关数据库调用是否成功的任何信息。请求已被接受进行处理,但尚未完成处理。 (...) 202响应是故意含糊不清的。
InstanceContext
对象来指定一个处理回调的对象。客户端重新获得控制,一个新线程异步等待服务响应,通知您成功或失败。
[ServiceContract]
interface IMyServiceContract
{
[OperationContract]
void DoSomeThing(InputMessage Message);
}
要将操作设置为单向操作,只需对其进行如下装饰:
[ServiceContract]
interface IMyServiceContract
{
[OperationContract(IsOneWay = true)]
void DoSomeThing(InputMessage Message);
}
用这种方式修饰的方法必须只有void返回类型。一个值得注意的问题是,服务将会很愉快地构建,而且你在连接时不会得到一个异常,说服务配置无效。
创建双向回调服务的接口代码如下:
[ServiceContract(CallbackContract = typeof(IMyContractCallback))]
interface IMyContract
{
[OperationContract(IsOneWay=true)]
void DoSomeThing(InputMessage Message);
}
public interface IMyContractCallback
{
[OperationContract(IsOneWay = true)]
void ServiceResponse(string result);
}
在客户端,您需要类似这样的东西来设置回调函数:
public class CallbackHandler : IMyContractCallback
{
#region IEchoContractCallback Members
public void ServiceResponse(string result)
{
//Do something with the response
}
#endregion
}
// And in the client when you set up the service call:
InstanceContext instanceContext = new InstanceContext(new CallbackHandler());
MyContractClient client = new MyContractClient(instanceContext);
InputMessage msg = new InputMessage();
client.DoSomething(msg);
class MyContractImplementation : IMyContract
{
public void DoSomeThing(MyMessage Message)
{
string responseMessage;
try
{
//Write to the database
responseMessage = "The database call was good!";
}
catch (Exception ex)
{
responseMessage = ex.Message;
}
Callback.ServiceResponse(responseMessage);
}
}
需要注意的一件重要的事情是,异常处理非常重要。如果:
消费了一个异常,你将不会收到任何错误警告(但回调函数仍然会执行)
抛出未处理的异常,服务将终止且客户端甚至无法获得回调。
这是与选项1相比这种方法的一个很大的缺点,选项1会在抛出未处理的异常时返回异常信息。
我认为这个问题需要更详细的阐述才能正确回答。首先,您当前正在使用哪种类型的绑定?
如果您正在使用支持可靠性的绑定,并且仅想要确保从客户端发出的消息确实已被服务器接收,则只需打开可靠性即可。有了此选项,WCF将在幕后自动使每个对话方说: “你收到了吗?” “我收到了,你收到了吗?” “我收到了。”