在 sharepoint 中设置流式 WCF 服务
Posted
技术标签:
【中文标题】在 sharepoint 中设置流式 WCF 服务【英文标题】:Setting up a streaming WCF service in sharepoint 【发布时间】:2014-12-11 02:22:52 【问题描述】:我正在尝试在 sharepoint 中设置一个简单的 WCF 服务,该服务将获取流并返回流。它有一个看起来像这样的方法:
public System.IO.Stream Convert(System.IO.Stream input)
// do stuff here
起初,我可以让它工作,因为它抱怨请求的大小。我发现这是由于未将其设置为在服务器端进行流式传输。所以在web.config
,我这样设置它的绑定:
<binding name="testBinding" maxBufferPoolSize="214748347" maxBufferSize="214748347"
maxReceivedMessageSize="214748347"
transferMode="Streamed">
这似乎解决了第一个问题,我现在可以在我的 Convert
方法中看到一个蒸汽,它似乎正在处理它。现在的问题在于回程。在我的客户端代码中,我做了这样的事情:
using (StreamReader sr = new StreamReader(file))
var sout = ts.Convert(sr.BaseStream);
using (var fs = File.Create(file + ".converted"))
while ((read = sout.Read(buffer, 0, buffer.Length)) > 0)
fs.Write(buffer, 0, read);
Console.WriteLine("Wrote " + read + " bytes...");
但问题是read
始终为 0。即使我可以确认 steam 在服务器端有数据,似乎也没有要读取的字节。所以我想到问题是我也需要在客户端获取transferMode
。所以我这样设置:
<basicHttpBinding>
<binding name="BasicHttpBinding_iSPTest" transferMode="Streamed">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Ntlm" />
<message clientCredentialType="UserName" algorithmSuite="Default"/>
</security>
</binding>
</basicHttpBinding>
但是现在,当我尝试在我的服务上使用任何方法(包括常规的、非 Steam 的)时,我得到了这个错误:
HTTP request streaming cannot be used in conjunction with HTTP authentication.
Either disable request streaming or specify anonymous HTTP authentication.
这似乎很简单,但我不知道如何让 Sharepoint 服务器接受匿名连接。如果我删除 security
的东西,或者在服务器端添加 security
部分并使用 mode = none
,我会得到 MessageSecurityException
:
The HTTP request is unauthorized with client authentication scheme 'Anonymous'.
The authentication header received from the server was 'NTLM'.
那么这里发生了什么?如何让我返回的流可读?我需要将服务器设置为允许匿名访问吗?如果有,怎么做?
【问题讨论】:
【参考方案1】:我间接回答你的问题,作为一个稍微不同的问题的旁白:
Catch-22 prevents streamed TCP WCF service securable by WIF; ruining my Christmas, mental health
我的回答没有专门针对 sharepoint,但它适用于您的情况。本质上,要点是整个挑战/响应 401 交换与流式传输不兼容,因为流式传输可能被发送两次(并且在第一次尝试时被 401 拒绝)。诀窍是使用第一个请求发送身份验证。这是通过自定义客户端行为/检查器组合并在客户端 WCF 配置中禁用身份验证来完成的,但在服务器上保持启用状态。在服务器端禁用单个 WCF 服务的身份验证将导致比在共享点上下文中更令人头疼的问题。相信我:)
祝你好运。
【讨论】:
感谢您的链接。这个需要我一段时间来消化。目前,我们实际上仅将 Sharepoint 用于单一目的。这不是我们通常使用的东西(因此我们不熟悉它)。当然,如果我们决定稍后将其用于其他用途,这可能会改变,所以我不想让未来的头痛。 好的:我实现了您在链接答案中的内容,并没有改变服务器端的任何内容并将客户端设置为使用自定义行为,但现在我收到消息The provided URI scheme 'http' is invalid; expected 'https'.
的参数异常
我将endpoint
地址(在客户端)从http
更改为https://myserver...
,但随后我得到一个“没有在https:// 监听的端点......” .我把服务器上的security
模式从none
改成了transport
,但还是没有骰子。
所以您没有在服务器上启用 SSL?好的,所以不要使用传输安全性。它应该是“none”,并且 url 协议应该是“http”
在服务器和客户端上都有security mode="None"
,我又回到了从The HTTP request is unauthorized with client authentication scheme 'Anonymous'. The authentication header received from the server was 'NTLM'.
开始的状态以上是关于在 sharepoint 中设置流式 WCF 服务的主要内容,如果未能解决你的问题,请参考以下文章