gpt4 book ai didi

.net - 将 protobuf-net 添加到我的 WCF Rest 服务

转载 作者:行者123 更新时间:2023-12-04 20:50:12 30 4
gpt4 key购买 nike

在 .NET 4 WCF 上启用 protobuf-net 序列化是否有任何规范的直接方法?我试图将代码简化到易于构建的程度:

这是我的服务代码:

[ServiceContract]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class MobileServiceV2
{
[WebGet(UriTemplate = "/some-data")]
[Description("returns test data")]
public MyResponse GetSomeData()
{
return new MyResponse { SomeData = "Test string here" };
}
}

[DataContract]
public class MyResponse
{
[DataMember(Order = 1)]
public string SomeData { get; set; }
}

我在 Application_OnStart 中激活这条服务路线(Global.asax) 像这样:
RouteTable.Routes.Add(new ServiceRoute("mobile", new MyServiceHostFactory(), typeof(MobileServiceV2)));

我用 MyServiceHostFactory使用 MEF 管理服务,但这无关紧要。

我的服务的配置都是默认的,Web.Config 中唯一的附加内容在这里:
<system.serviceModel>    
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
<standardEndpoints>
<webHttpEndpoint>
<standardEndpoint helpEnabled="true" maxReceivedMessageSize="5242880" defaultOutgoingResponseFormat="Json" automaticFormatSelectionEnabled="true">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
</standardEndpoint>
</webHttpEndpoint>
</standardEndpoints>
</system.serviceModel>

好的,服务还活着并且正在运行。有移动/帮助,我可以在移动/某些数据上发出 GET 并在 XML 和 JSON 中获得响应

application/xml 返回 XML,application/json 返回 JSON

我需要做什么才能让客户端设置 application/x-protobufs 并使用 protobuf-net 编码他们的响应?

我读了一整天,越来越糊涂了……

这是我到目前为止发现的内容,似乎没有任何直接的解决方案:
  • http://www.danrigsby.com/blog/index.php/2008/03/07/xmlserializer-vs-datacontractserializer-serialization-in-wcf/
  • http://weblogs.thinktecture.com/cweyer/2010/12/using-jsonnet-as-a-default-serializer-in-wcf-httpwebrest-vnext.html

  • 第二个链接是我需要的,但对我不起作用。不知道为什么,但我不知道是哪个命名空间 MediaTypeProcessor生活在,只是不能让它在 .NET4 中工作?

    关于通过 web.config 配置 protobuf-net 的各种分散信息给了我不同的错误,我只是不确定我需要那样做。我宁愿只有代码解决方案。

    编辑:

    根据我的研究 - 我的不好, MediaFormatter似乎不在当前版本的 WCF 中。我想知道为所有 protobuf 客户端创建单独的 URL 是否最好?这样我就可以接收Stream并返回Stream。手动处理所有序列化逻辑。更多的工作,但我会更好地控制实际数据。

    最佳答案

    首先要做的是添加Microsoft.AspNet.WebApi (“Microsoft ASP.NET Web API 核心库 (RC)”)和 Microsoft.AspNet.WebApi.Client (“Microsoft ASP.NET Web API 客户端库(RC)”)通过 NuGet。

    这看起来是最有希望的演练:http://byterot.blogspot.co.uk/2012/04/aspnet-web-api-series-part-5.html
    MediaTypeFormatterSystem.Net.Http.Formatting
    我现在没有时间尝试让它工作,但你可以 推测 通过以下方式添加格式化程序:

    GlobalConfiguration.Configuration.Formatters.Add(
    new ProtobufMediaTypeFormatter(RuntimeTypeModel.Default));

    举个例子 完全未经测试 实现类似的东西:
    public class ProtobufMediaTypeFormatter : MediaTypeFormatter
    {
    private readonly TypeModel model;
    public override bool CanReadType(Type type)
    {
    return model.IsDefined(type);
    }
    public override bool CanWriteType(Type type)
    {
    return model.IsDefined(type);
    }
    public ProtobufMediaTypeFormatter() : this(null) {}
    public ProtobufMediaTypeFormatter(TypeModel model) : base()
    {
    this.model = model ?? RuntimeTypeModel.Default;
    SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/protobuf"));
    }
    public override System.Threading.Tasks.Task<object> ReadFromStreamAsync(Type type, System.IO.Stream stream, HttpContentHeaders contentHeaders, IFormatterLogger formatterLogger)
    {
    // write as sync for now
    var taskSource = new TaskCompletionSource<object>();
    try
    {
    taskSource.SetResult(model.Deserialize(stream, null, type));
    } catch (Exception ex)
    {
    taskSource.SetException(ex);
    }
    return taskSource.Task;
    }
    public override System.Threading.Tasks.Task WriteToStreamAsync(Type type, object value, System.IO.Stream stream, HttpContentHeaders contentHeaders, System.Net.TransportContext transportContext)
    {
    // write as sync for now
    var taskSource = new TaskCompletionSource<object>();
    try
    {
    model.Serialize(stream, value);
    taskSource.SetResult(null);
    }
    catch (Exception ex)
    {
    taskSource.SetException(ex);
    }
    return taskSource.Task;
    }
    }

    我对 Web API 几乎一无所知,所以如果你设法让它为你工作,请告诉我。我很乐意添加一个受支持的包装器作为可下载的二进制文件,但在它工作之前我不能这样做;p

    关于.net - 将 protobuf-net 添加到我的 WCF Rest 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11572263/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com