0

OData V3 の WCF Data Services 5.0 にアップグレードした後、挿入または更新を行うことができません。可能な唯一のものは選択です。

編集

オーバーライドされたメソッド HandleException の例外:

例外: System.Data.Services.DataServiceException: Content-Type ヘッダー値がありません。System.Data.Services.HttpProcessUtility.ReadContentType (文字列 contentType、文字列 & mime、エンコーディング & エンコーディング) で System.Data.Services.Serializers.Deserializer.CreateDeserializer (RequestDescription の説明、IDataService dataService、ブール値の更新、UpdateTracker トラッカー) で System.Data. Services.DataService 1.HandlePostOperation(RequestDescription description, IDataService dataService) at System.Data.Services.DataService1.ProcessIncomingRequest (RequestDescription の説明、IDataService dataService) で System.Data.Services.DataService 1.HandleNonBatchRequest(RequestDescription description) at System.Data.Services.DataService1.HandleRequest()

レスポンスステータスコード: 400

Client-Code 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";
    }

Service-Code: サービスはこのヘッダーを解析し、トークンをチェックします

    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");
        }
    }

ご協力いただきありがとうございます。

そして私

4

1 に答える 1

0

ここにもっとテキストを入れる必要があるので、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の最新のWCFDS5.0ビットを使用してこれを実行すると機能します。また、FiddlerでContent-Typeヘッダーを送信することを確認しました。

一方、リクエストにはContent-Typeヘッダーがありません。最新のNuGetパッケージを使用していること、および上記で投稿したコードが実際にテストしているものであることを確認してください。

于 2012-06-22T08:46:57.007 に答える