在 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 服务的主要内容,如果未能解决你的问题,请参考以下文章

在 WCF 服务中设置绑定

在 Web 应用程序中设置 WCF TCP 服务

在 WCF 项目中设置 Web API

在sharepoint 2010中设置搜索栏样式

powershell 在客户端对象模型的sharepoint中设置文件上载大小

如何在SharePoint 2010中设置SPField的内部名称?