1

我对打开 moss 站点的单向 Web 方法有疑问(可能是因为在单向 Web 方法中,上下文为空)

是否可以重写此代码以删除空引用异常?(没有单向属性我没有例外)

[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)
4

3 回答 3

1

我找到了解决我的问题的解决方法。创建新的 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;
        }
于 2008-12-10T10:28:00.577 回答
0

我看到的唯一含义是您实际上正在使用新的 HttpContext。

嗯..duh :)

Anyway, this will have implications if you also have input- and outputfilters set up. For example if you are using WebServiceExtensions (WSE) with your own input and outputfilters. In that case, you should store the data in the HttpContext (that is there in your input- and outputfilters) and use that one. Just so that you use only one httpContext, instead of creating a second one, and to prevent any future errors when extending your software.

于 2008-12-24T19:30:08.647 回答
0

Use this will work for you:

SPWeb web = SPContext.Current.Web
于 2009-10-27T11:22:43.310 回答