WCF WebHttp, Сервис, Поведения, Конечные точки, Custom Formatter - PullRequest
2 голосов
/ 15 июля 2011

Я следовал этому руководству для создания своего пользовательского форматера, чтобы я мог использовать Newtonsoft Json.NET для сериализации объектов, поскольку встроенный в Microsoft один не поддерживает циклы из отношений родитель / потомок.

http://blogs.msdn.com/b/carlosfigueira/archive/2011/05/03/wcf-extensibility-message-formatters.aspx

В своем примере он вручную создает своего ServiceHost.Я использую Routes и WebServiceFactory, которому меня научило это руководство.

http://blogs.msdn.com/b/endpoint/archive/2010/01/06/introducing-wcf-webhttp-services-in-net-4.aspx

Из того, что я могу сказать, мне просто нужно найти способ добавить соответствующее поведение в мою службуконечные точки.Буду признателен за любую помощь в указании меня в правильном направлении.

Некоторые фрагменты кода ниже для удобства ссылок ...


В моем Global.asax

        WebServiceHostFactory webServiceHostFactory = new WebServiceHostFactory();
        RouteTable.Routes.Add(new ServiceRoute(Accounts.Route, webServiceHostFactory, typeof(Accounts)));

Если мой web.config

<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
<standardEndpoints>
    <webHttpEndpoint>
    <!-- 
        Configure the WCF REST service base address via the global.asax.cs file and the default endpoint 
        via the attributes on the <standardEndpoint> element below
    -->
    <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="false" defaultOutgoingResponseFormat="Json"/>
    </webHttpEndpoint>
</standardEndpoints>

В основной функции его программы

        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
        host.AddServiceEndpoint(typeof(ITestService), new BasicHttpBinding(), "soap");
        WebHttpBinding webBinding = new WebHttpBinding();
        webBinding.ContentTypeMapper = new MyRawMapper();
        host.AddServiceEndpoint(typeof(ITestService), webBinding, "json").Behaviors.Add(new NewtonsoftJsonBehavior());

1 Ответ

1 голос
/ 15 июля 2011

Чтобы использовать маршруты и получить ссылку на конечную точку службы, вам понадобится ваша фабрика хостов настраиваемых служб. Он может сделать то же самое, что и WebServiceHostFactory, который вы используете в данный момент (просто вернуть ссылку на WebServiceHost), но вместо этого вернуть ссылку на ваш хост пользовательской службы.

Более подробную информацию о фабриках хостов службы можно найти по адресу http://blogs.msdn.com/b/carlosfigueira/archive/2011/06/14/wcf-extensibility-servicehostfactory.aspx.

.
public class MyServiceHostFactory : ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        return base.CreateServiceHost(serviceType, baseAddresses);
    }

    class MyServiceHost : WebServiceHost
    {
        public MyServiceHost(Type serviceType, Uri[] baseAddresses)
            : base(serviceType, baseAddresses)
        { }

        protected override void OnOpening()
        {
            base.OnOpening();

            foreach (ServiceEndpoint endpoint in this.Description.Endpoints)
            {
                CustomBinding custom = endpoint.Binding as CustomBinding;
                if (custom != null)
                {
                    custom = new CustomBinding(endpoint.Binding);
                }

                custom.Elements.Find<WebMessageEncodingBindingElement>().ContentTypeMapper = new MyRawMapper();
                endpoint.Binding = custom;

                endpoint.Behaviors.Add(new NewtonsoftJsonBehavior());
            }
        }
    }
}
...