2013-12-23 81 views
3

我有用户注册servicestack 4功能的问题。ServiceStack 4用户注册不起作用

我的代码与在ServiceStack wiki中编写的代码完全相同。与

{"username" : "user1", "password" : "user1Pwd"} 

回报

{ 
    "ResponseStatus": { 
     "ErrorCode": "NullReferenceException", 
     "Message": "Object reference not set to an instance of an object.", 
     "StackTrace": "[Register: 23.12.2013 11:17:44]:\n[REQUEST: {UserName:user1,Password:user1Pwd}]\nSystem.NullReferenceException: Object reference not set to an instance of an object.\r\n в ServiceStack.Auth.RegistrationValidator.<.ctor>b__3(String x)\r\n в ServiceStack.FluentValidation.DefaultValidatorExtensions.<>c__DisplayClass1`2.<Must>b__0(T x, TProperty val)\r\n в ServiceStack.FluentValidation.DefaultValidatorExtensions.<>c__DisplayClass4`2.<Must>b__3(T x, TProperty val, PropertyValidatorContext propertyValidatorContext)\r\n в ServiceStack.FluentValidation.DefaultValidatorExtensions.<>c__DisplayClass7`2.<Must>b__6(Object instance, Object property, PropertyValidatorContext propertyValidatorContext)\r\n в ServiceStack.FluentValidation.Validators.PredicateValidator.IsValid(PropertyValidatorContext context)\r\n в ServiceStack.FluentValidation.Validators.PropertyValidator.Validate(PropertyValidatorContext context)\r\n в ServiceStack.FluentValidation.Validators.DelegatingValidator.Validate(PropertyValidatorContext context)\r\n в ServiceStack.FluentValidation.Internal.PropertyRule.InvokePropertyValidator(ValidationContext context, IPropertyValidator validator, String propertyName)\r\n в ServiceStack.FluentValidation.Internal.PropertyRule.<Validate>d__8.MoveNext()\r\n в System.Linq.Enumerable.<SelectManyIterator>d__14`2.MoveNext()\r\n в System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)\r\n в System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)\r\n в ServiceStack.FluentValidation.AbstractValidator`1.Validate(ValidationContext`1 context)\r\n в ServiceStack.FluentValidation.AbstractValidator`1.ServiceStack.FluentValidation.IValidator.Validate(ValidationContext context)\r\n в ServiceStack.FluentValidation.DefaultValidatorExtensions.Validate[T](IValidator`1 validator, T instance, IValidatorSelector selector, String ruleSet)\r\n в ServiceStack.FluentValidation.DefaultValidatorExtensions.ValidateAndThrow[T](IValidator`1 validator, T instance, String ruleSet)\r\n в ServiceStack.FluentValidation.DefaultValidatorExtensions.ValidateAndThrow[T](IValidator`1 validator, T instance, ApplyTo ruleSet)\r\n в ServiceStack.Auth.RegisterService`1.Post(Register request)\r\n в lambda_method(Closure , Object , Object)\r\n в ServiceStack.Host.ServiceRunner`1.Execute(IRequest request, Object instance, TRequest requestDto)", 
     "Errors": [] 
    } 
} 

而且

public class AppHost : AppHostBase 
     { 
      public AppHost() : base("Hello Web Services", typeof(HelloService).Assembly { } 

      public override void Configure(Funq.Container container) 
      { 
       Plugins.Add(new AuthFeature(() => new AuthUserSession(), 
        new IAuthProvider[] { 
        new BasicAuthProvider() 
        })); 

       Plugins.Add(new RegistrationFeature()); 

       container.Register<ICacheClient>(new MemoryCacheClient()); 
       var userRep = new InMemoryAuthRepository(); 
       container.Register<IUserAuthRepository>(userRep); 
      } 
     } 

     protected void Application_Start(object sender, EventArgs e) 
     { 
      new AppHost().Init(); 
     } 

POST /注册,3

回答

1

Juast的错误。 它被固定在4.0.6

2

我碰到了同样的问题来到了这个代码工作正常与ServiceStack,这是唯一的办法就是在不关闭ValidationFeature的情况下解决它(会失去太多好东西)。

查看RegistrationFeature的SourceCode,它所做的只是注册一个路由,一个服务和一个验证器。

https://github.com/ServiceStack/ServiceStack/blob/master/src/ServiceStack/RegistrationFeature.cs

我简单地复制到这一点我自己的“注册特性”,并修改了注册验证违规登记我自己的就行了。

然后我注册了我自己的注册功能,而不是app_startup中的现有注册功能。所有这些似乎都在起作用,但要注意,你将失去一些需要重新实施的验证。

的Global.asax

Plugins.Add(new MyRegistrationFeature()); 

MyRegistrationFeature.cs

public class MyRegistrationFeature : IPlugin 
{ 
    public string AtRestPath { get; set; } 

    public MyRegistrationFeature() 
    { 
     this.AtRestPath = "/register"; 
    } 

    public void Register(IAppHost appHost) 
    { 
     appHost.RegisterService<RegisterService>(AtRestPath); 
     appHost.RegisterAs<MyRegistrationValidator, IValidator<Register>>(); 
    } 
}