3

.NET 3.5では、次のコードがありました。

[WebService(Namespace = "http://kitchenpc.com/schemas/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class KitchenPC : System.Web.Services.WebService
{
   [WebMethod]
   public LogonResult Logon(string username, string password)
   {
      //If username and password are not valid...
      throw new InvalidUsernameOrPasswordException();
   }
}

呼び出すときに、無効なユーザー名とパスワードを渡した場合、InvalidUsernameOrPasswordExceptionがスローされ、を確認することでJavascriptで例外をキャッチできerror.get_exceptionType()ます。これは、Webサービスが例外情報をJSONでシリアル化するためです。

しかし、.NET 4.5にアップグレードすると、これは壊れました。ここで、無効なユーザー名とパスワードを渡すと、HTTP応答が返されます。

HTTP/1.1 500 Internal Server Error
Cache-Control: private
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/7.5
jsonerror: true
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Sat, 24 Nov 2012 22:42:33 GMT
Content-Length: 91

{"Message":"There was an error processing the request.","StackTrace":"","ExceptionType":""}

基本的に、例外タイプは失われ、一般的なエラーメッセージに置き換えられます。

この動作が変更された原因は何ですか?JSONで例外情報を返す方法はまだありますか?私のAPI全体のほとんどは、この動作に依存するように設計されています。

4

2 に答える 2

6

ああ、これはばかげた問題でした。例外情報は、次の場合にのみ表示されます。

<customErrors mode="Off" />

web.config(の下<system.web>)。これが.NET3.5->.NET 4.5の動作の変更なのか、それともweb.configトランスフォームを使用してweb.configビルドプロセスを書き直したときに壊れたのかは実際にはわかりません。

Webサービスレベルごとにこれを制御する方法があるかどうか誰かが知っていますか?通常のページリクエストで完全なデバッグ情報を表示したくありません。

アップデート:

また、Webサービスからエラー情報を伝達するために例外をスローすることは、実際には適切な設計ではないという結論に達しました。実際、興味のある人のために、ブログにこのテーマに関する投稿を書きました。

于 2012-11-24T22:59:47.467 に答える
0

例外タイプはシリアル化できません。代わりにFaultExceptionを使用してください。

throw new FaultException(..);
于 2012-11-24T22:57:53.220 に答える