gpt4 book ai didi

web-services - 子网站中的 Sharepoint Web 服务

转载 作者:行者123 更新时间:2023-12-04 07:07:57 25 4
gpt4 key购买 nike

我正在尝试构建一个对子网站上下文敏感的 Web 服务(即,它公开了一个需要能够触摸特定子网站中的列表的 WebMethod)。

我已经使用以下文件部署了 Web 应用程序:

ISAPI/MyService.asmx
ISAPI/MyServiceWsdl.aspx
ISAPI/MyServiceDisco.aspx

代码隐藏:
[WebService]
public class MyService : System.Web.Services.WebService
{
[WebMethod]
public ListSettings GetListSettings(string listName)
{
SPWeb site = SPControl.GetContextWeb(this.Context);
SPList list = site.Lists[listName];

return new ListSettings(list);
}

[WebMethod]
public void UpdateListSettings(string listName, ListSettings settings)
{
SPWeb site = SPControl.GetContextWeb(this.Context);
SPList list = site.Lists[listName];

list.EnableFolderCreation = settings.EnableFolders;
list.Update();
}
}

public class ListSettings
{
public ListSettings() { }

internal ListSettings(SPList list)
{
EnableFolders = list.EnableFolderCreation;
}

public bool EnableFolders { get; set; }
}

这似乎在我的网站集的根网站上工作得很好。但是,当我向 http://moss/subweb/_vti_bin/MyService.asmx 提出请求时,并在断点处停止web方法检查HttpContext,发现请求已发送至 http://moss/_vti_bin/MyService.asmx .

我阅读了许多资源,这些资源描述了 WSDL/disco 文件和 ISAPI 中的 spdisco.aspx 文件中所需的调整,并做了我应该做的调整。像这样:

在 MyServiceDisco.aspx 中:
<%@ Page Inherits="System.Web.UI.Page" Language="C#" %>
<%@ Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Import Namespace="Microsoft.SharePoint.Utilities" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<% Response.ContentType = "text/xml"; %>

<discovery xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/disco/">
<contractRef ref=<% SPEncode.WriteHtmlEncodeWithQuote(Response, SPWeb.OriginalBaseUrl(Request) + "?wsdl", '"'); %>
docRef=<% SPEncode.WriteHtmlEncodeWithQuote(Response, SPWeb.OriginalBaseUrl(Request), '"'); %>
xmlns="http://schemas.xmlsoap.org/disco/scl/" />
<soap address=<% SPEncode.WriteHtmlEncodeWithQuote(Response, SPWeb.OriginalBaseUrl(Request), '"'); %>
xmlns:q1="http://tempuri.org/" binding="q1:MyServiceSoap" xmlns="http://schemas.xmlsoap.org/disco/soap/" />
<soap address=<% SPEncode.WriteHtmlEncodeWithQuote(Response, SPWeb.OriginalBaseUrl(Request), '"'); %>
xmlns:q2="http://tempuri.org/" binding="q2:MyServiceSoap12" xmlns="http://schemas.xmlsoap.org/disco/soap/" />
</discovery>

在 MyServiceWsdl.aspx 的顶部:
<%@ Page Inherits="System.Web.UI.Page" Language="C#" %>
<%@ Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Import Namespace="Microsoft.SharePoint.Utilities" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<% Response.ContentType = "text/xml"; %>

在底部:
<wsdl:service name="MyService">
<wsdl:port name="MyServiceSoap" binding="tns:MyServiceSoap">
<soap:address location=<% SPEncode.WriteHtmlEncodeWithQuote(Response, SPWeb.OriginalBaseUrl(Request), '"'); %> />
</wsdl:port>
<wsdl:port name="MyServiceSoap12" binding="tns:MyServiceSoap12">
<soap12:address location=<% SPEncode.WriteHtmlEncodeWithQuote(Response, SPWeb.OriginalBaseUrl(Request), '"'); %> />
</wsdl:port>
</wsdl:service>

最后,添加到 spdisco.aspx:
<contractRef ref=<% SPEncode.WriteHtmlEncodeWithQuote(Response, spWeb.Url + "/_vti_bin/MyService.asmx?wsdl", '"'); %>
docRef=<% SPEncode.WriteHtmlEncodeWithQuote(Response, spWeb.Url + "/_vti_bin/MyService.asmx", '"'); %>
xmlns="http://schemas.xmlsoap.org/disco/scl/" />
<discoveryRef ref=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(spWeb.Url + "/_vti_bin/MyService?disco"),Response.Output); %>
xmlns="http://schemas.xmlsoap.org/disco/" />

终于,我以为我已经做了一切必要的工作,以使该服务在网站集中的每个网站中都能正常工作,但可惜,这似乎并不正确。我忘了做什么?

更新 :另一个花絮是,尝试获取发现 XML 会导致“未找到”共享点错误。换句话说,访问 http://moss/mysubsite/_vti_bin/MyService.asmx?disco导致 Sharepoint“找不到文件”错误。

更新 :原来在 MyServiceDisco.aspx 中有一个小错误导致“找不到文件”错误。但是,我解决了这个问题,现在服务完全中断了。使用 WCF 测试客户端时,我收到一条错误消息“服务器无法处理请求。---> 未将对象引用设置为对象的实例”,然后是堆栈跟踪。从我正在处理的应用程序中,当我调用生成的代理类“MyServiceSoapClient”时,响应是“远程服务器返回错误:NotFound”。

啊!

更新 :好的,“未设置对象引用...”消息是我的一个愚蠢错误的结果。现在似乎一切正常, 除了 SPContext.Current.HttpRequestContext.Request.Path 属性始终显示根 web 下服务的 url,而不是当前 web。我使用 Wireshark 来确保客户端发布到正确的 url(它是: http://moss/subweb/_vti_bin/MyService.asmx ),我使用了 ASP.NET 跟踪工具并且没有发现任何错误(请求显示在使用正确的 url 进行跟踪),并且我使用了 IIS 跟踪实用程序 (logman.exe),它没有显示任何意外。一旦我在我的服务中遇到断点,唯一似乎不正确的是 HttpRequest 上下文。

最佳答案

Duuude... 我在 SharePoint 的各个部分遇到了足够多的类似问题,我完全相信它仍然是一个测试版产品。

终于,我发现使用 SPContext 而不是 SPControl 来获取当前 Web 可以满足我的需求。所有 MSDN 文档都说要像这样获取 Web:

SPControl.GetContextWeb(this.Context);

而且,如果你拆开内置的 Web 服务,你会发现这也是内置 Web 服务获取当前 Web 的方式。对于我的服务,它不起作用,而这样做:
SPContext.Current.Site.OpenWeb();

为什么????为什么,微软,为什么???!!!

关于web-services - 子网站中的 Sharepoint Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/822941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com