我应该从服务层返回什么? DotNetOpenAuth

时间:2011-01-16 21:10:02

标签: asp.net-mvc-2 service-layer

我想知道在这种情况下应该返回什么。我的Ui和服务层在不同的项目中。

这就是发生的事情

- >用户来到网站 - >用户选择openId提供程序并点击登录 - >回到控制器

 [HttpPost]
        public ActionResult Login(LoginViewModel loginViewModel)
        {
           var test = accountService.SendOpenIdRequest(loginViewModel.OpenId);

        }


public class LoginViewModel
    {
        public OpenId OpenId { get; set; }
    }

所以我接受了一个包含我的域类的ViewModel。

 public class OpenId
    {
        public string Url { get; set; }
    }

到目前为止,我的SendOpenIdRequest

  public ?  SendOpenIdRequest(OpenId openId)
        {
            var openIdRelyingParty = new OpenIdRelyingParty();
            var response = openIdRelyingParty.GetResponse();

            Identifier id;
            if (Identifier.TryParse(openId.Url, out id))
            {
                try
                {
                    var req = openIdRelyingParty.CreateRequest(openId.Url);
                    return req.RedirectingResponse
                }
                catch (ProtocolException ex)
                {
                }
            }

            return null;
        }

现在这就是我迷失的地方,因为我可以回报这么多东西。

我可以回来了

return req.RedirectingResponse.AsActionResult()

但是我认为这会很糟糕,因为现在我依赖于asp.net mvc ActionResult,如果我说这个服务层用于其他项目(也许我有一个连接到移动应用程序的web服务)。它不会起作用。

我可以return OutgoingWebResponse但是一旦我找回它,我不确定该怎么做。

我还可以返回从CreateRequest()

生成的IAuthenticationRequest

最后,我可以使用上面列出的其中一个返回我的域对象(OpenId)。

1 个答案:

答案 0 :(得分:0)

您可以返回OutgoingWebResponse

public OutgoingWebResponse SendOpenIdRequest(OpenId openId)
{
    using (var openIdRelyingParty = new OpenIdRelyingParty())
    {
        var response = openIdRelyingParty.GetResponse();
        Identifier id;
        if (Identifier.TryParse(openId.Url, out id))
        {
            try
            {
                var req = openIdRelyingParty.CreateRequest(openId.Url);
                return req.RedirectingResponse
            }
            catch (ProtocolException ex)
            {
            }
        }
        return null;
    }
}

然后在你的控制器中:

[HttpPost]
public ActionResult Login(LoginViewModel loginViewModel)
{
    var response = accountService.SendOpenIdRequest(loginViewModel.OpenId);
    if (response == null)
    {
        ModelState.AddModelError(
            "openid_identifier", 
            "The specified login identifier is invalid"
        );
        return View();
    }
    return response.AsActionResult();
}
相关问题