升级到WCF数据服务5.0后缺少Content-Type标头值

时间:2012-05-15 15:00:21

标签: wcf wcf-data-services

升级到ODCA V3的WCF Data Services 5.0后,我无法进行插入或更新。 唯一可能的是选择。

修改

重写方法HandleException中的异常:

例外: System.Data.Services.DataServiceException:缺少Content-Type标头值。    at System.Data.Services.HttpProcessUtility.ReadContentType(String contentType,String& mime,Encoding& encoding)    在System.Data.Services.Serializers.Deserializer.CreateDeserializer(RequestDescription描述,IDataService数据服务,布尔更新,UpdateTracker跟踪器)    在System.Data.Services.DataService 1.HandlePostOperation(RequestDescription description, IDataService dataService) at System.Data.Services.DataService 1.ProcessIncomingRequest(RequestDescription描述,IDataService dataService)    在System.Data.Services.DataService 1.HandleNonBatchRequest(RequestDescription description) at System.Data.Services.DataService 1.HandleRequest()

ResponseStatusCode:400

客户代码的 我在HTTP-Request-Header中设置了一个令牌......

    /// <summary>
    /// Initializes a new instance of the <see cref="ServiceBase"/> class.
    /// </summary>
    /// <param name="uri">service uri</param>
    protected ServiceBase(Uri uri)
    {
        this.Context = new Entities(uri) { MergeOption = MergeOption.OverwriteChanges };
        this.Context.SendingRequest += new EventHandler<SendingRequestEventArgs>(this.ContextSendingRequest);
    }

    /// <summary>
    /// OnSendingRequest
    /// </summary>
    /// <param name="sender">source</param>
    /// <param name="e">event args</param>
    private void ContextSendingRequest(object sender, SendingRequestEventArgs e)
    {
        e.RequestHeaders["token"] = "xyassdfdfdfdf";
    }

服务代码: 服务解析此标头并检查令牌

    public XYDataService()
    {
        this.ProcessingPipeline.ProcessingRequest += this.ProcessingPipelineProcessingRequest;
    }


    /// <summary>
    /// OnProcessingRequest
    /// </summary>
    /// <param name="sender">source</param>
    /// <param name="e">event args</param>
    private void ProcessingPipelineProcessingRequest(object sender, DataServiceProcessingPipelineEventArgs e)
    {
        var authHeader = HttpContext.Current.Request.Headers["token"];

        if (string.IsNullOrEmpty(authHeader) || !authHeader.Equals("xyassdfdfdfdf"))
        {
            throw new DataServiceException(401, "401 Unauthorized");
        }
    }

感谢您的帮助。

岸堤

1 个答案:

答案 0 :(得分:0)

使用答案,因为我需要在这里添加更多文字。

我为你尝试了一个非常相似的代码,但它运行得很好:

DemoService ctx = new DemoService(new Uri("http://services.odata.org/(S(jcemln1vp0u1gqtoyqqpwrc1))/OData/OData.svc/"));
ctx.UsePostTunneling = true;
ctx.SendingRequest += (sender, ea) => { ea.RequestHeaders["token"] = "value"; };

ctx.UpdateObject(ctx.Products.First());
ctx.SaveChanges();

使用NuGet的最新WCF DS 5.0位运行此工作。我还向Fiddler证实它确实发送了Content-Type标题。

另一方面,您的请求没有Content-Type标头。您能否确认您使用的是最新的NuGet软件包,以及您上面发布的代码是否真的是您正在测试的内容?