Метод MVC 4 SimpleMembership HasLocalAccount не найден

При попытке доступа к /account/manage на рабочем сервере я получаю эту ошибку:

System.MissingMethodException: Method not found: 'Boolean WebMatrix.WebData.ExtendedMembershipProvider.HasLocalAccount(Int32)'.
   at Microsoft.Web.WebPages.OAuth.OAuthWebSecurity.HasLocalAccount(Int32 userId)
   at PROJECT.Controllers.AccountController.Manage(Nullable`1 message)
   at lambda_method(Closure , ControllerBase , Object[] )
   at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
   at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
   at Castle.Proxies.AsyncControllerActionInvokerProxy.InvokeActionMethod_callback(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   at Castle.Proxies.Invocations.ControllerActionInvoker_InvokeActionMethod.InvokeMethodOnTarget()
   at Castle.DynamicProxy.AbstractInvocation.Proceed()
   at Glimpse.Mvc3.Interceptor.InvokeActionMethodInterceptor.Intercept(IInvocation invocation)
   at Castle.DynamicProxy.AbstractInvocation.Proceed()
   at Castle.Proxies.AsyncControllerActionInvokerProxy.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41()
   at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__36(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.<>c__DisplayClass2a.<BeginInvokeAction>b__20()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult)
   at System.Web.Mvc.Controller.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()
   at System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()
   at System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult)
   at System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult)
   at System.Web.Mvc.MvcHandler.<>c__DisplayClass6.<>c__DisplayClassb.<BeginProcessRequest>b__4(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()
   at System.Web.Mvc.MvcHandler.<>c__DisplayClasse.<EndProcessRequest>b__d()
   at System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f)
   at System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action)
   at System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)
   at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

Он отлично работает с локального хоста. Поиск в гугле ничего не дал.

Также следует отметить, что я пытаюсь заставить этого проклятого «простого» провайдера членства работать на сервере sql вместо того, чтобы позволять ему создавать базу данных.

p.s. Я на виртуальном хостинге.

Изменить Добавлен полный стек


person Eonasdan    schedule 13.09.2012    source источник
comment
Та же проблема здесь. Я не на виртуальном хостинге - на собственном сервере Win2008.   -  person simon831    schedule 01.11.2012


Ответы (3)


Единственное, что делает эта функция, это запрашивает webpages_Membership таблицу. Моя работа заключается в дублировании функции. Если я получу реальный ответ, я обновлю

internal static bool HasLocalAccount(int userId)
        {
            using (YOUREntities db = new YOUREntities ()) 
            {
                webpages_Membership wm = db.webpages_Membership.Where(x => x.UserId == userId).FirstOrDefault();

                if (wm != null) return true;
                return false;
            }

        }
person Eonasdan    schedule 14.09.2012
comment
Спасибо - это сработало и для меня. Не могу понять в чем проблема. - person rwalter; 29.11.2012
comment
Куда вы поместили эту функцию? Внутри MembershipProvider? Внутри вашего контроллера? - person Dan Csharpster; 09.07.2014
comment
Неважно. Я идиот. Я должен был потратить 2 секунды, чтобы увидеть его в провайдере, прежде чем опубликовать свой комментарий. Прости. - person Dan Csharpster; 09.07.2014

Оригинальная функция, опубликованная Eonasdan, у меня не работала. Мне пришлось немного подправить его, чтобы заставить его работать. Если кому поможет, вот:

@functions{
internal static bool HasLocalAccount(int userId){
    using ( var db = Database.Open("your_database_name") ) {
        dynamic id = db.QueryValue(@"SELECT UserId FROM webpages_Membership WHERE UserId=@0", userId);
        return id != null; // returns true if id is not null
    }
}
}
person flakomalo    schedule 30.05.2013

У меня тоже была эта проблема. В моем случае это произошло потому, что на моем сервере не были установлены двоичные файлы MVC 4.

В следующем вопросе SO есть инструкции по его установке:

Затем повторите попытку со ссылкой на учетную запись/управление — она должна работать.

NB не забудьте взломать свой HasLocalAccount() (если вы применили обходной путь, содержащийся в других ответах здесь).

person Ilan    schedule 11.06.2013