2012-01-10 81 views
0

我的目标是将wcf调用记录到一个IIS托管的wcf服务,并将它们重播到不同的wcf服务。到目前为止,我有一个IDispatchMessageInspector工作以下this example,它可以记录一个传入的请求和相应的答复到磁盘。将自定义WCF消息发送到服务

如何从磁盘读取消息并将其发送到其他服务?有没有一种方法让客户端在不通过普通客户端代理对象的情况下将低级别Message对象发送到服务?

回答

1

我能够得到它通过简单地创建一个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(); 
} 

这是什么在IDispatchMessageInspector类:

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; 
} 
1

是的,如果您在通信协议层面工作,发送原始消息应该很容易。这是我的旧examples之一。

+0

警告:安全性和可靠性将无法正常工作。 – JohnC 2012-01-10 22:55:30

+0

是的。我怀疑你想自己实现它:) – 2012-01-11 08:27:27