C# 向服务发送自定义WCF消息

C# 向服务发送自定义WCF消息,c#,wcf,c#-4.0,C#,Wcf,C# 4.0,我的目标是记录对一个IIS托管的wcf服务的wcf调用,并将它们重播到另一个wcf服务。到目前为止,我有一个工作的追随者,它可以记录传入的请求和相应的磁盘回复 如何从磁盘读取消息,然后将其发送到其他服务?客户端是否有一种方法可以在不通过普通客户端代理对象的情况下向服务发送低级消息对象?是的,如果您在通信协议级别工作,则发送原始消息应该很容易。这是我的一个老版本。我只需创建一个IRequestChannel就可以让它工作,阅读下面的内容有助于解释它是如何工作的 发送消息的代码: priv

我的目标是记录对一个IIS托管的wcf服务的wcf调用,并将它们重播到另一个wcf服务。到目前为止,我有一个工作的追随者,它可以记录传入的请求和相应的磁盘回复


如何从磁盘读取消息,然后将其发送到其他服务?客户端是否有一种方法可以在不通过普通客户端代理对象的情况下向服务发送低级消息对象?

是的,如果您在通信协议级别工作,则发送原始消息应该很容易。这是我的一个老版本。

我只需创建一个IRequestChannel就可以让它工作,阅读下面的内容有助于解释它是如何工作的

发送消息的代码:

private static void TestDispatchingMessage()
{
    var reader = XmlDictionaryReader.CreateBinaryReader(new FileStream(@"path\request_6c6fc02f-45a7-4049-9bab-d6f2fff5cb2d.xml", FileMode.Open), XmlDictionaryReaderQuotas.Max);
    var message = Message.CreateMessage(reader, int.MaxValue, MessageVersion.Soap11);
    message.Headers.To = new System.Uri(@"url");


    BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.None)
    {
        MessageEncoding = WSMessageEncoding.Mtom,
        MaxReceivedMessageSize = int.MaxValue,
        SendTimeout = new TimeSpan(1, 0, 0),
        ReaderQuotas = { MaxStringContentLength = int.MaxValue, MaxArrayLength = int.MaxValue, MaxDepth = int.MaxValue }
    };

    var cf = new ChannelFactory<IRequestChannel>(binding, new EndpointAddress(@"url"));

    foreach (OperationDescription op in cf.Endpoint.Contract.Operations)
    {
        op.Behaviors.Remove<DataContractSerializerOperationBehavior>();
        op.Behaviors.Add(new ProtoBehaviorAttribute());
    }

    cf.Open();
    var channel = cf.CreateChannel();
    channel.Open();

    var result = channel.Request(message);

    Console.WriteLine(result);

    channel.Close();
    cf.Close();
}

对。我怀疑你是否愿意自己实施:)
public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
{
    var callId = Guid.NewGuid();

    var action = request.Headers.Action.Substring(request.Headers.Action.LastIndexOf('/'));
    var fileName = string.Format(@"path\{0}_{1}.data", action, callId);

    try
    {
        var buffer = request.CreateBufferedCopy(int.MaxValue);

        var writeRequest = buffer.CreateMessage();
        using (var stream = new FileStream(fileName, FileMode.CreateNew))
        {
            using (var writer = XmlDictionaryWriter.CreateBinaryWriter(stream))
            {
                writeRequest.WriteMessage(writer);
                writer.Flush();
            }
        }

        request = buffer.CreateMessage();
        buffer.Close();
    }
    catch (Exception ex)
    {
        Log.ErrorException("Error writing", ex);
    }

    Log.Info("Call {0}", callId);

    return callId;
}