在sharepoint中设置流式WCF服务

时间:2014-10-15 21:11:04

标签: wcf sharepoint

我试图在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.即使我可以确认蒸汽在服务器端有数据,也似乎没有字节可读。所以我想到问题是我需要在客户端获得transferMode。所以我这样设置:

        <basicHttpBinding>
            <binding name="BasicHttpBinding_iSPTest" transferMode="Streamed">
                <security mode="TransportCredentialOnly">
                    <transport clientCredentialType="Ntlm" />
                  <message clientCredentialType="UserName" algorithmSuite="Default"/>
                </security>
            </binding>
        </basicHttpBinding>

但是现在当我尝试在我的服务上点击任何方法(包括常规,非蒸汽方法)时,我收到此错误:

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 个答案:

答案 0 :(得分:1)

我间接地回答你的问题,只是略微不同的问题:

Catch-22 prevents streamed TCP WCF service securable by WIF; ruining my Christmas, mental health

我的回答并不专门针对sharepoint,但它适用于您的情况。本质上,要点是整个挑战/响应401交换与流不兼容,因为流可以被发送两次(并且在第一次尝试时拒绝401)。诀窍是使用第一个请求发送身份验证。这是通过自定义客户端行为/检查器组合完成的,并在客户端WCF配置中禁用身份验证,但在服务器上启用它。在服务器端禁用单个WCF服务的身份验证将导致比在sharepoint上下文中的值更多的麻烦。相信我:))

祝你好运。