【问题标题】:MVC Web API in SharePoint siteSharePoint 网站中的 MVC Web API
【发布时间】:2015-01-10 14:27:09
【问题描述】:

我们正在将我们的大部分网络存在转移到我们在云中的 SharePoint 服务器。我们当前的设置使用 MVC Web API 从 DB 检索数据。我们不想将 API 托管在单独的域下,因此也需要将 API 移动到 SharePoint 域下。这个要求没有放宽。

有没有办法将我的 API 发布到 SharePoint?或者 Visual Studio 中是否有特定于 SharePoint 的 API 项目模板?如果不是,我有什么选择?

编辑 最初,我要求 MVC API 需要成为 SharePoint 2013 的一部分。但现在,API 可以驻留在 SharePoint 内部或外部的任何位置,只要它是可从根域访问 - 到目前为止似乎不允许(错误消息:不允许在没有应用上下文的情况下调用 WebProxy。”)。仍在尝试查看这是否可行,如果可以,怎么做?

【问题讨论】:

  • 您拥有/控制共享点场,还是托管在 my-company.sharepoint.com(“在他的云中”)?
  • @danludwig my-company.sharepoint.com(但这是否意味着我不控制 sp 农场?)
  • 您不能将 WebAPI 发布到 sharepoint.com 租户。你不放松的要求根本不可行。您只能使用@IAfanasov 在他的回答中提到的应用模型。
  • 需求其实是基于避开CORS路由。满足此要求的另一种方法(无论 API 托管在何处)可以在 SP 中创建一个代理页面,该页面采用 URL,发送到 SP 之外的 API 并简单地返回 API 回复的任何内容。我尝试遵循这个想法,但没有找到创建包含代码的代理页面的方法。在 VS 2013 中有一个“Sharepoint 应用程序”模板(就像@IAfanasov 提到的那样),但这看起来像是一个用户交互应用程序的模板。尝试添加模块和客户端 Web 部件,但仍然没有代码隐藏!
  • 您不会在应用程序中使用 CORS 来获取共享点。您不能编写在 SharePoint 服务器上运行的任何代码。对于 SharePoint 托管的应用程序,您根本无法编写任何服务器端代码。对于提供商托管的应用程序,您只能使用 CSOM 编写在提供商 Web 中运行的服务器端代码。听起来您的解决方案可能是仅限 javascript 的解决方案。有一个 API 可让您通过让服务器调用通过已托管在 sharepoint.com 中的代理来解决跨域问题。

标签: sharepoint asp.net-web-api asp.net-mvc-5 sharepoint-2013


【解决方案1】:

听起来您要创建的代理已经是 SharePoint JSOM 的一部分。看看这些:

http://msdn.microsoft.com/en-us/library/office/fp179895(v=office.15).aspx

http://msdn.microsoft.com/en-us/library/office/jj245162(v=office.15).aspx

这将使您能够克服跨源问题。 SP.WebProxySP.WebRequestInfo 允许您使用 javascript 在执行 javascript 的域之外进行调用。

在幕后真正发生的是,SharePoint 的 javascript API 将请求发送到您的 sharepoint.com 租赁服务器,然后该服务器将从 SharePoint 服务器调用该服务,并将响应返回给您的 javascript。您可以在共享点托管的应用程序中实现它:

// this javascript executes from my-company.sharepoint.com
var responseDocument = undefined;
$('#cross').click(function () {
    var ctx = SP.ClientContext.get_current();
    var request = new SP.WebRequestInfo();
    request.set_url('https://www.somewebapi.com/my/custom/route');
    request.set_method("GET");
    responseDocument = SP.WebProxy.invoke(ctx, request); // executes on sp server
    ctx.executeQueryAsync(onSuccess, onError);
});
function onSuccess() {
    var response = responseDocument.get_body();
    alert('success ' + response);
}
function onError(err) {
    alert(JSON.stringify(err));
}

...并且由于托管在其他域的远程api是从服务器调用的,因此您不必担心任何跨域问题。

更新

如需回复您的更新,请check the results from this link

您是否已将远程端点添加到您的 AppManifest.xml 中?

【讨论】:

  • ...sharepoint.com 租赁服务器... - 酷!让我检查一下!
  • onSuccess 回调警告“不允许在没有应用上下文的情况下调用 WebProxy。”
  • @greatbear302 请点击 OP 评论以在聊天中继续讨论。
  • @greatbear302 查看我的更新。以上仅适用于共享点应用程序。在该应用的 AppManifest.xml 中,您需要添加 API 的远程端点。
  • 我已尝试搜索该错误(带引号),但没有发现任何有用的信息。我已经将端点添加到 appmanifest.xml,但后来意识到 SharePoint 应用程序模型不是我想要的。我正在尝试查找是否可以从根域本身执行此操作(it's AppManifest.xml 在哪里?)。最后的手段可能是 jsonp
【解决方案2】:

SharePoint 不会让您有机会定义自己的路线。这就是为什么你不能使用老式的 SharePoint 解决方案来发布 asp.net web api。您可以考虑使用apps for SharePoint。它就像一个单独的应用程序,与 SharePoint 有一些连接。

【讨论】:

  • 如果 API 位于 SP 之外,我如何从根域(而不是通过应用程序)访问它?
【解决方案3】:

最终切换到 JSONP 解决方案。在 Visual Studio 的我的 MVC Web API 项目中安装了WebApiContrib.Formatting.JsonP,并修改了调用 API 的 SharePoint JavaScript,以包含?callback=?(回调等于问号)。一切都保持不变。无需 SharePoint 的代理调用者!无需 SharePoint 应用程序!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    相关资源
    最近更新 更多