一個更好的方法是通過implementing IDispatchMessageInspector and modifying the message in BeforeSendReply更換響應 - 利用the example you mentioned類:
public class CustomInspector : IDispatchMessageInspector
{
public object AfterReceiveRequest(ref Message request, IClientChannel channel,
InstanceContext instanceContext)
{
return null;
}
public void BeforeSendReply(ref Message reply, object correlationState)
{
reply = ChangeResponse(reply);
}
private Message ChangeResponse(Message oldMessage)
{
// change message
}
}
然後,你需要創建支持類:
public class CustomExtension : BehaviorExtensionElement
{
protected override object CreateBehavior()
{
return new CustomBehavior();
}
public override Type BehaviorType
{
get
{
return typeof(CustomBehavior);
}
}
}
public class CustomBehavior : IServiceBehavior
{
public void ApplyDispatchBehavior(ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase)
{
foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers.OfType<ChannelDispatcher>())
{
foreach (var endpoint in dispatcher.Endpoints)
{
endpoint.DispatchRuntime.MessageInspectors.Add(new CustomInterceptor());
}
}
}
public void AddBindingParameters(ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints,
BindingParameterCollection bindingParameters)
{
}
public void Validate(ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase)
{
}
}
這就可以讓你在服務配置中聲明檢查員:將此文本添加到<system.serviceModel>
部分(將Your.Namespace
替換爲實際的類名稱空間):
<extensions>
<behaviorExtensions>
<!-- Replace default response -->
<add name="CustomExtension"
type="Your.Namespace.CustomExtension, Your.Namespace,
Version=1.0.0.0, Culture=neutral" />
</behaviorExtensions>
</extensions>
最後,將此新行爲擴展添加到服務行爲。您將需要更換:defaultBehaviour
與實際名稱,您將在<services><service name="YourService" behaviorConfiguration="defaultBehaviour"> <!-- < that's the name you want -->
<behaviors>
<serviceBehaviors>
<behavior name="defaultBehaviour">
<CustomExtension/>
發現語義上,在第二響應唯一的差別是標籤methodResponse和其內部的XML。你想添加這個標籤,或者你需要命名命名空間前綴是完全一樣的嗎? –
我只需要用包含首選XML的逐字字符串來替換默認的XML數據。我不需要更改名稱空間和標題。可能嗎? –
我跟着一些教程,並帶着這個http://ideone.com/bFbnGk但是我不知道如何使它工作(可能我不知道如何將檢查器添加到web.config),我仍然得到默認響應。 THX –