веб-сервис oneway и новый SPSite (myUrl) - PullRequest
1 голос
/ 04 декабря 2008

У меня проблема с односторонним веб-методом, который открывает сайт мха (возможно, потому, что в одностороннем веб-методе контекст нулевой)

Можно ли переписать этот код, чтобы удалить исключение нулевой ссылки? (без атрибута oneway у меня нет исключения)

[SoapDocumentMethod(OneWay = true)]
        [WebMethod(Description = "TestOneWay")]
        public voidTestOneWay(string webUrl)
        {
            using (SPSite site = new SPSite(webUrl))
            {
                 ....
            }
         }

Исключение составляет:

[2304] Error:Object reference not set to an instance of an object.
[2304] w3wp.exe Error: 0 :
[2304StackTrace:   at System.Web.Hosting.ISAPIWorkerRequestInProc.GetAdditionalServerVar(Int32 index)
[2304]    at System.Web.Hosting.ISAPIWorkerRequestInProc.GetServerVariable(String name)
[2304]    at System.Web.HttpRequest.AddServerVariableToCollection(String name)
[2304]    at System.Web.HttpRequest.FillInServerVariablesCollection()
[2304]    at System.Web.HttpServerVarsCollection.Populate()
[2304]    at System.Web.HttpServerVarsCollection.Get(String name)
[2304]    at System.Collections.Specialized.NameValueCollection.get_Item(String name)
[2304]    at Microsoft.SharePoint.SPGlobal.CreateSPRequestAndSetIdentity(Boolean bNotGlobalAdminCode, String strUrl, Boolean bNotAddToContext, Byte[] UserToken, String userName, Boolean bIgnoreTokenTimeout, Boolean bAsAnonymous)
[2304]    at Microsoft.SharePoint.SPRequestManager.GetContextRequest(SPRequestAuthenticationMode authenticationMode)
[2304]    at Microsoft.SharePoint.Administration.SPFarm.get_RequestNoAuth()
[2304]    at Microsoft.SharePoint.SPSite.CopyUserToken(SPUserToken userToken)
[2304]    at Microsoft.SharePoint.SPSite.SPSiteConstructor(SPFarm farm, Guid applicationId, Guid contentDatabaseId, Guid siteId, SPUrlZone zone, Uri requestUri, String serverRelativeUrl, Boolean hostHeaderIsSiteName, Uri redirectUri, Pairing pairing, SPUserToken userToken)
[2304]    at Microsoft.SharePoint.SPSite..ctor(SPFarm farm, Uri requestUri, Boolean contextSite, SPUserToken userToken)
[2304]    at Microsoft.SharePoint.SPSite..ctor(String requestUrl)
[2304]    at Reply.Moss2EAI.SPHandler.GetAllFlowConfiguration(String webUrl, String flowConList)
[2304]    at Reply.Moss2EAI.EaiMossIntegration.GetMessagesFromEai(String webUrl, String listName, String applicationName)

Ответы [ 3 ]

1 голос
/ 10 декабря 2008

Я нашел обходной путь для решения моей проблемы. Создайте новый HttpContext. Вопрос сейчас: это правильное решение или есть последствия, которые я не рассматриваю?

метод, который я использую для изменения контекста, таков:

//Call this before call new SPSite()
 private static void ChangeContext(string webUrl)
        {
            Trace.TraceInformation("ChangeContext");
            HttpContext current = HttpContext.Current;
            HttpRequest request = new HttpRequest("", webUrl, "");
            HttpContext.Current = new HttpContext(request, new HttpResponse(new StringWriter(CultureInfo.CurrentCulture)));
            HttpContext.Current.User = current.User;
        }
0 голосов
/ 27 октября 2009

Используйте это будет работать для вас:

SPWeb web = SPContext.Current.Web
0 голосов
/ 24 декабря 2008

Единственное, что я вижу, это то, что вы на самом деле используете новый HttpContext.

Ну что ж ...)

В любом случае, это будет иметь последствия, если у вас также настроены входные и выходные фильтры. Например, если вы используете WebServiceExtensions (WSE) со своими собственными входными и выходными фильтрами. В этом случае вы должны сохранить данные в HttpContext (который находится в ваших входных и выходных фильтрах) и использовать их. Просто для того, чтобы вы использовали только один httpContext вместо создания второго, и чтобы предотвратить будущие ошибки при расширении вашего программного обеспечения.

...