Created
October 8, 2015 22:44
-
-
Save vendettamit/a40f619c9dfcc3026635 to your computer and use it in GitHub Desktop.
The class contains a solution to use Types signature of methods in WebHttpBinding in WCF.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Reflection; | |
using System.ServiceModel; | |
using System.ServiceModel.Channels; | |
using System.ServiceModel.Description; | |
using System.ServiceModel.Dispatcher; | |
using System.Web; | |
namespace WcfService_Everything | |
{ | |
public class MyOperationBehavior : IOperationBehavior | |
{ | |
public void AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters) | |
{ | |
} | |
public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation) | |
{ | |
} | |
public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation) | |
{ | |
dispatchOperation.Invoker = new ValueCastInvoker(dispatchOperation.Invoker); | |
} | |
public void Validate(OperationDescription operationDescription) | |
{ | |
} | |
} | |
public class MyWebHttpBehavior : WebHttpBehavior | |
{ | |
public override void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) | |
{ | |
foreach (var operation in endpoint.Contract.Operations) | |
{ | |
if (operation.Behaviors.Contains(typeof(MyOperationBehavior))) | |
continue; | |
operation.Behaviors.Add(new MyOperationBehavior()); | |
} | |
base.ApplyDispatchBehavior(endpoint, endpointDispatcher); | |
} | |
protected override IDispatchMessageFormatter GetRequestDispatchFormatter(OperationDescription operationDescription, ServiceEndpoint endpoint) | |
{ | |
foreach (var item in operationDescription.Messages[0].Body.Parts) | |
{ | |
item.Type = typeof(string); | |
} | |
return base.GetRequestDispatchFormatter(operationDescription, endpoint); | |
} | |
} | |
public class ValueCastInvoker : IOperationInvoker | |
{ | |
readonly IOperationInvoker _invoker; | |
public ValueCastInvoker(IOperationInvoker invoker) | |
{ | |
_invoker = invoker; | |
} | |
public ValueCastInvoker(IOperationInvoker invoker, Type type, Object value) | |
{ | |
_invoker = invoker; | |
} | |
public object[] AllocateInputs() | |
{ | |
return _invoker.AllocateInputs().ToArray(); | |
} | |
private object[] CastCorrections(object[] inputs) | |
{ | |
Guid obj; | |
var value = inputs[0] as string; | |
if (Guid.TryParse(value, out obj)) | |
{ | |
return new[] { (object)obj }.Concat(inputs.Skip(1)).ToArray(); | |
} | |
return inputs.ToArray(); | |
} | |
public object Invoke(object instance, object[] inputs, out object[] outputs) | |
{ | |
return _invoker.Invoke(instance, CastCorrections(inputs), out outputs); | |
} | |
public IAsyncResult InvokeBegin(object instance, object[] inputs, AsyncCallback callback, object state) | |
{ | |
return _invoker.InvokeBegin(instance, inputs, callback, state); | |
} | |
public object InvokeEnd(object instance, out object[] outputs, IAsyncResult result) | |
{ | |
return _invoker.InvokeEnd(instance, out outputs, result); | |
} | |
public bool IsSynchronous | |
{ | |
get { return _invoker.IsSynchronous; } | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment