我试图在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'.
那么这里发生了什么?如何让我的返回流可读?我是否需要将服务器设置为允许匿名访问?如果是这样,怎么样?
答案 0 :(得分:1)
我间接地回答你的问题,只是略微不同的问题:
Catch-22 prevents streamed TCP WCF service securable by WIF; ruining my Christmas, mental health
我的回答并不专门针对sharepoint,但它适用于您的情况。本质上,要点是整个挑战/响应401交换与流不兼容,因为流可以被发送两次(并且在第一次尝试时拒绝401)。诀窍是使用第一个请求发送身份验证。这是通过自定义客户端行为/检查器组合完成的,并在客户端WCF配置中禁用身份验证,但在服务器上启用它。在服务器端禁用单个WCF服务的身份验证将导致比在sharepoint上下文中的值更多的麻烦。相信我:))
祝你好运。