Delphi-如何使用带有netHTTPBindings的WCF服务
我有一个用Visual Studio 2015(c#)编写的WCF服务,它使用web套接字,这意味着端点配置了netHTTPBindings。我有一个Delphi应用程序,我目前用XE编写,希望使用WCF服务,Delphi应用程序使用web套接字WCF服务的最佳方式是什么 //编辑--------------------------------------------------------------------------- 我现在正在使用wsDualHttpBindings,下面是一些原型代码: WCF服务接口Delphi-如何使用带有netHTTPBindings的WCF服务,wcf,delphi,binding,delphi-xe,Wcf,Delphi,Binding,Delphi Xe,我有一个用Visual Studio 2015(c#)编写的WCF服务,它使用web套接字,这意味着端点配置了netHTTPBindings。我有一个Delphi应用程序,我目前用XE编写,希望使用WCF服务,Delphi应用程序使用web套接字WCF服务的最佳方式是什么 //编辑--------------------------------------------------------------------------- 我现在正在使用wsDualHttpBindings,下面是一些原型
[ServiceContract(CallbackContract = typeof(IStatusCallback))]
public interface IStatusService
{
[OperationContract(IsOneWay = true)]
Task StartSendingStatus();
}
[ServiceContract]
public interface IStatusCallback
{
[OperationContract(IsOneWay = true)]
Task SendStatus(string aValue);
}
实施
public class StatusService : IStatusService
{
public async Task StartSendingStatus()
{
var callback = OperationContext.Current.GetCallbackChannel<IStatusCallback>();
while (((IChannel)callback).State == CommunicationState.Opened)
{
await callback.SendStatus(GetStatus());
await Task.Delay(1000);
}
}
private string GetStatus()
{
// For now return datetime
string dt = DateTime.UtcNow.ToString();
return Convert.ToString(dt);
}
}
这很好,我想知道用Delphi编写上述客户机代码的最佳方法。导入WSDL文件时,它没有IStatusServiceCallback接口 netHTTPBindings仅适用于.NET。只需打开WCF进行BasicHTTPBinding。如果不能做到这一点,可以创建一个与WCF对话的.NET COM DLL包装器。BasicHTTPBindings不支持双工,这是web套接字所必需的。我将研究是否可以使用wsDualHTTPBindings,我的测试c#控制台应用程序与wsDualHTTPBindings一起工作。从我所阅读的内容来看,使用wsDualHTTPBinding的回调只与.NET一起工作,因此这似乎无法使用Delphi实现,我需要另一种方法。正如我所说,通过COM DLL公开所需的功能,并使用Delphi提供的功能。在.NET中使用WS确实很容易…是的,我知道在.NET中使用WCF服务很容易,但我的问题是如何在Delphi应用程序中使用它。Delphi似乎有一个局限性,它不能直接使用服务。您知道关于如何从WCF服务向Delphi应用程序发送更新的最佳实践的任何示例或文档吗?是从服务向Delphi应用程序(HTTP服务器)发送HTTP post的一种方法。
public partial class ClientForm : Form
{
private StatusServiceReference.StatusServiceClient StatusService;
private class CallbackHandler : StatusServiceReference.IStatusServiceCallback
{
private ListBox _listbox;
public CallbackHandler(ListBox aListBox)
{
_listbox = aListBox;
}
public void SendStatus(string aValue)
{
_listbox.Items.Add(aValue);
_listbox.SelectedIndex = _listbox.Items.Count - 1;
}
}
public ClientForm()
{
InitializeComponent();
var context = new InstanceContext(new CallbackHandler(StatusListBox));
StatusService = new StatusServiceReference.StatusServiceClient(context);
}
private void StatusBtn_Click(object sender, EventArgs e)
{
StatusService.StartSendingStatus();
}
}