升级到WCF Data Services 5.0后缺少内容类型标头值
升级到OData V3的WCF Data Services 5.0后,我无法进行插入或更新。 唯一可能的是选择 编辑 重写方法HandleException中的异常: 例外情况: System.Data.Services.DataServiceException:缺少内容类型标题值。 位于System.Data.Services.HttpProcessUtility.ReadContentType(字符串contentType、字符串和mime、编码和编码) 位于System.Data.Services.Serializers.Deserializer.CreateDeserializer(请求描述、IDataService数据服务、布尔更新、UpdateTracker跟踪程序) 在System.Data.Services.DataService升级到WCF Data Services 5.0后缺少内容类型标头值,wcf,wcf-data-services,Wcf,Wcf Data Services,升级到OData V3的WCF Data Services 5.0后,我无法进行插入或更新。 唯一可能的是选择 编辑 重写方法HandleException中的异常: 例外情况: System.Data.Services.DataServiceException:缺少内容类型标题值。 位于System.Data.Services.HttpProcessUtility.ReadContentType(字符串contentType、字符串和mime、编码和编码) 位于System.Data.Serv
1.HandlePostOperation(RequestDescription描述,IDataService数据服务)
在System.Data.Services.DataService中
1.ProcessIncomingRequest(请求描述,IDataService数据服务)
位于System.Data.Services.DataService1.HandleNonBatchRequest(请求描述)
在System.Data.Services.DataService中
1.HandleRequest()
响应代码:400
客户端代码
我在HTTP请求头中设置了一个令牌
/// <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";
}
//
///初始化类的新实例。
///
///服务uri
受保护的ServiceBase(Uri)
{
this.Context=新实体(uri){MergeOption=MergeOption.OverwriteChanges};
this.Context.SendingRequest+=新事件处理程序(this.ContextSendingRequest);
}
///
///OnSendingRequest
///
///来源
///事件参数
私有void ContextSendingRequest(对象发送者,SendingRequestEventArgs e)
{
e、 RequestHeaders[“令牌”]=“XYASSDFDF”;
}
服务代码:
服务解析此标头并检查令牌
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");
}
}
public XYDataService()
{
this.ProcessingPipeline.ProcessingRequest+=this.ProcessingPipelineProcessingRequest;
}
///
///OnProcessingRequest
///
///来源
///事件参数
私有void ProcessingPipelineProcessingRequest(对象发送方、DataServiceProcessingPipelineEventArgs e)
{
var authHeader=HttpContext.Current.Request.Headers[“token”];
if(string.IsNullOrEmpty(authHeader)| |!authHeader.Equals(“XYASSDFDF”))
{
抛出新的DataServiceException(401,“401未经授权”);
}
}
谢谢你的帮助
Andi使用answer,因为我需要在这里添加更多文本 我尝试了一个与您的代码非常相似的代码,但效果很好:
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 works最新的WCF DS 5.0位运行此命令。我还使用Fiddler验证了它是否发送内容类型头
另一方面,您的请求没有内容类型头。您能否验证您使用的是最新的NuGet软件包,并且您上面发布的代码确实是您正在测试的代码?您能否更详细地描述一下该场景?你用的是什么客户机?如果可能的话,你能用Fiddler抓取一个跟踪吗?在保存更改期间,我得到了错误。没有问题。在更新期间或添加新条目时,我会遇到上述错误。我正在使用silverlight客户端。你能把异常和调用堆栈一起发布吗?另外,请使用Fiddler并获取失败的请求/响应的跟踪。var authHeader=HttpContext.Current.request.Headers[“token”];当我把它评论出来时,它不起作用。但是我需要检查客户端设置的令牌?当你说“它不工作”时,请你更具体一点,用调用堆栈和理想情况下处理的一小段代码发布异常。嗨,vitek,我使用的是最新版本5.0.1。使用之前的版本4.0一切正常。如果可能,请准备一个复制项目,并将其发送给我microsoft com上的vitek.karas。