2

ASP.NET MVC 3 を使用して RESTful Web サービスを作成しています。基本的な GET/POST/PUT マッピングをそれぞれ取得/作成/更新アクションに使用しています。私のドメイン タイプの 1 つで完全に機能しますが、別のタイプにまったく同じ一連のアクションを実装していて、ローカルの ASP.NET 開発サーバーから 401 Unauthorized 応答を受け取ります。

まず、ルートが作成される MyApiAreaRegistration.cs の RegisterArea メソッドの関連セクションを次に示します (簡潔にするために Update メソッドを削除しました)。

// student detail
context.MapRoute(
    "StudentDetailV1",
    "MyApi/v1/family/{email}/student/{id}",
    new { controller = "Student", action = "StudentDetail" },
    new { httpMethod = new HttpMethodConstraint("GET") }
);

// create student
context.MapRoute(
    "CreateStudentV1",
    "MyApi/v1/family/{email}/student",
    new { controller = "Student", action = "CreateStudent" },
    new { httpMethod = new HttpMethodConstraint("POST") }
);

// family detail
context.MapRoute(
    "FamilyDetailV1",
    "MyApi/v1/family/{email}",
    new { controller = "Student", action = "FamilyDetail" },
    new { httpMethod = new HttpMethodConstraint("GET") }
);

// create family
context.MapRoute(
    "CreateFamilyV1",
    "MyApi/v1/family",
    new { controller = "Student", action = "CreateFamily" },
    new { httpMethod = new HttpMethodConstraint("POST") }
);

そして StudentController で:

/// <summary>
/// return json representation of FamilyDto
/// </summary>
/// <param name="email"></param>
/// <returns></returns>
[HttpGet]
public ActionResult FamilyDetail(string email)
{
    Family f = _studentDataAccess.GetFamilyByEmail(email.Trim());
    if (f == null)
    {
        return HttpNotFound();
    }

    FamilyDto familyDto = FamilyDtoAssembler.GetDtoFromFamily(f);

    return Json(familyDto, JsonRequestBehavior.AllowGet);
}

[HttpPost]
public ActionResult CreateFamily(FamilyDto familyDto)
{
    if (string.IsNullOrWhiteSpace(familyDto.Email))
    {
        return new HttpStatusCodeResult(409, "Email address is required.");
    }

    // check for already existing family with that email.
    Family f = _studentDataAccess.GetFamilyByEmail(familyDto.Email.Trim());
    if (f != null)
    {
        return new HttpStatusCodeResult(409, "Email address must be unique.");
    }

    // turn family into a Family object with Parents
    Family family = FamilyDtoAssembler.GetFamilyFromDto(familyDto);

    // save family via dal (username = family email)
    _studentDataAccess.CreateFamily(family, family.Email);

    // return redirect to family detail
    return RedirectToRoute("FamilyDetailV1", new { email = family.Email });
}


[HttpPost]
public ActionResult CreateStudent(string email, StudentDto studentDto)
{
    if (string.IsNullOrWhiteSpace(email))
    {
        return HttpNotFound();
    }

    Family family = _studentDataAccess.GetFamilyByEmail(email.Trim());

    if (family == null)
    {
        return HttpNotFound();
    }

    Student s = StudentDtoAssembler.GetStudentFromDto(_repository, studentDto);

    s.Family = family;
    _studentDataAccess.CreateStudent(s, email);

    return RedirectToRoute("StudentDetailV1", new { email = email, id = s.Id });
}

[HttpGet]
public ActionResult StudentDetail(string email, int id)
{
    Student s = _studentDataAccess.GetStudent(id);
    if (s == null || s.Family.Email != email)
    {
        return HttpNotFound();
    }

    StudentDto studentDto = GeneralDtoAssembler.GetSingleStudentDto(s, s.MatsRegistrations);

    return Json(studentDto, JsonRequestBehavior.AllowGet);
}

ここで、Fiddler を使用して「ファミリーの作成」アクションへの POST リクエストを作成し、ファミリー DTO の定義と一致する適切な JSON リクエスト本文を使用すると、アクションは 302 レスポンスを返し、新しく作成されたファミリーの詳細アクションにリダイレクトされます。家族。これはまさに私が望むように機能します。ただし、問題は「学生の作成」アクションです。デバッガーでステップ実行すると、正しく動作し、RedirectToRoute の結果が返されますが、Fiddler で表示されるのは次の応答だけです。

HTTP/1.1 401 Unauthorized
Server: ASP.NET Development Server/10.0.0.0
Date: Tue, 17 Apr 2012 16:42:10 GMT
X-AspNet-Version: 4.0.30319
jsonerror: true
Cache-Control: private
Content-Type: application/json; charset=utf-8
Content-Length: 105
Connection: Close

{"Message":"Authentication failed.","StackTrace":null,"ExceptionType":"System.InvalidOperationException"}

web.configで認証モードを「Windows」から「None」に変更することから、ルートの並べ替え、RedirectToRouteの代わりにRedirectToActionを返すことまで、考えられるすべてを試しましたが、何も機能しません。RedirectToRoute の結果ではなく、CreateStudent から直接の Json の結果を返すだけであることに注意してください (200 ステータスで、結果は問題なく表示されます)。ただし、CreateStudent と CreateFamily の動作が異なる理由がわかりません。2 日間、気が狂いそうになっています。ハァルプ?

4

1 に答える 1

0

問題は、学生ルートの静的 URL セグメントでした。に変更StudentDetailV1"MyApi/v1/family/{email}/{id}"、正常に動作するようになりました。

于 2012-04-18T15:47:35.990 に答える