Delphi-如何使用带有netHTTPBindings的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,下面是一些原型

我有一个用Visual Studio 2015(c#)编写的WCF服务,它使用web套接字,这意味着端点配置了netHTTPBindings。我有一个Delphi应用程序,我目前用XE编写,希望使用WCF服务,Delphi应用程序使用web套接字WCF服务的最佳方式是什么

//编辑---------------------------------------------------------------------------

我现在正在使用wsDualHttpBindings,下面是一些原型代码:

WCF服务接口

[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();
    }
}