2012-01-10 78 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