8

現在、WCF RESTful サービスを .NET 3.5 (スターター キット) から .NET 4 に移行しています。Visual Studio 2010 の WCF Rest サービス テンプレートを使用してプロジェクトを開始しました。 RequestInterceptor で行われます) ServiceAuthorizationManager を使用します。いくつかの作業と調査の後、私はそれを成し遂げました。しかし今、私は付随的な問題を抱えています。私のサービスは、HTTP ステータス コードと簡単な説明を使用して、処理エラーをクライアントにフィードバックしていました。サービスメソッドの多くのポイントで WebOperationContext を使用して、次のようにクライアントに問題を説明していました。

protected void returnCode(HttpStatusCode code, string description)
{
    WebOperationContext ctx = WebOperationContext.Current;
    ctx.OutgoingResponse.StatusDescription = description;
    ctx.OutgoingResponse.StatusCode = code;
}

しかし、WCF 4 では、StatusCode のみが機能します - StatusDescription はサイレントに失敗します。理由がわかりません。私の唯一の推測は、この新しい WCF 4 シナリオでは WebOperationContext が機能しないということです。代わりに OperationContext を使用する必要がありますが、それも機能しません。次のメソッドは、ServiceAuthorizationManager を拡張するカスタム クラスで使用され、認証ダイジェストの形式が正しくないためにリクエストにアクセスできないことをクライアントに通知します。

private void GenerateBadDigestMessage(ref OperationContext operationContext)
{
    Message reply = Message.CreateMessage(MessageVersion.None, null, null, new DataContractJsonSerializer(typeof(object)));

    HttpResponseMessageProperty hrp = new HttpResponseMessageProperty();
    hrp.StatusCode = HttpStatusCode.Forbidden;
    hrp.StatusDescription = "bad digest";
    reply.Properties[HttpResponseMessageProperty.Name] = hrp;

    operationContext.RequestContext.Reply(reply);
    operationContext.RequestContext = null;
}

ここで (WebOperationContext の代わりに) OperationContext を直接使用しても、StatusDescription は機能しません。

ここで何が欠けていますか?なぜこのような小さなことが .NET 3.5 から 4 に移行できるのでしょうか?

4

4 に答える 4

4

WebFaultException.NET 4.0 での使用をお勧めします。たとえば、「.NET 4 での WCF WebHttp サービスの紹介」をお読みください。試す

throw new WebFaultException<string> ("bad digest", HttpStatusCode.Forbidden);
于 2011-01-13T23:14:45.780 に答える
2

わかった!これが私が見つけたものです。私のコードには何も問題はありません。.NET Framework 3.5 または 4.0 に問題はありません。

問題はasp.net開発サーバーです。サービス アプリケーションをデバッグする場合、それは asp.net 開発サーバーでホストされる可能性が高く、アプリケーションによって提供されるステータスの説明を完全に無視します。この質問を参照してください

少なくとも私を助けようとした@Olegに報奨金を授与します。

于 2011-01-19T17:35:26.377 に答える
1

Service Method NULL オブジェクトから戻っていることを確認してください...ステータスコードの説明が応答ヘッダーに表示されるように、私にとってはうまくいきました。

于 2011-03-18T16:10:41.973 に答える
1

潜在的な問題の 1 つは、RequestContext を null に設定していることです。

operationContext.RequestContext.Reply(reply);     
operationContext.RequestContext = null; 

もう 1 つの可能性は、パラメーター「説明」が設定されていないことです。

また、クライアント側でチェックしています:

WebOperationContext.Current.IncomingResponse.StatusDescription

もう 1 つの可能性として、returnCode が呼び出された後に値が上書きされた可能性はありますか?

于 2011-01-19T08:32:53.657 に答える