将 transferMode 更改为“Streamed”后无法加载 wcf restful 帮助页面

Posted

技术标签:

【中文标题】将 transferMode 更改为“Streamed”后无法加载 wcf restful 帮助页面【英文标题】:unable to load wcf restful help page after changing transferMode to "Streamed" 【发布时间】:2011-08-21 16:14:16 【问题描述】:

在我的项目中,一个 wcf restful 服务,它允许用户将照片上传到 web 服务。

更改配置设置以允许上传大文件后。 (添加绑定配置,即“TransferMode”、“BufferSize”等) 所有运营合同都按预期工作。

但是,端点的服务帮助页面停止工作。

删除端点上的绑定配置设置后,帮助页面返回

我该如何解决这个问题?我错过了哪里

谢谢大家

<bindings>
          <webHttpBinding>
              <!-- buffer: 64KB; max size: 64MB -->
              <binding name="StreamedBinding" closeTimeout="00:01:00" openTimeout="00:01:00" 
                       receiveTimeout="00:10:00" sendTimeout="00:01:00" transferMode="Streamed" 
                       maxBufferPoolSize="67108864" maxBufferSize="65536" maxReceivedMessageSize="67108864">
              </binding>
          </webHttpBinding>
</bindings>

<service name="WCFRestFul.ApiRestful">
        <endpoint address="" binding="webHttpBinding"
                  bindingConfiguration="StreamedBinding" bindingName="StreamedBinding" 
                  contract="WCFRestFul.IApiRestful" behaviorConfiguration="web" />
 </service>

更新: 我认为这不仅仅是因为传输模式,还可能是其他一些设置。 一旦我删除了上面代码中的“bindingConfiguration”,服务帮助页面就会返回。 我有 2 个端点。另一个端点没有“bindingConfiguration”,服务帮助页面可以正常工作。 我肯定在这里错过了一些东西,也许是一些简单的东西。 任何帮助将不胜感激

【问题讨论】:

【参考方案1】:

我接受了 carlosfigueira 的建议,痛苦地一次删除我的配置设置。

我从

更改了我的配置设置

旧代码

<bindings>
          <webHttpBinding>
              <!-- buffer: 64KB; max size: 64MB -->
              <binding name="StreamedBinding" closeTimeout="00:01:00" openTimeout="00:01:00" 
                       receiveTimeout="00:10:00" sendTimeout="00:01:00" transferMode="Streamed" 
                       maxBufferPoolSize="67108864" maxBufferSize="65536" maxReceivedMessageSize="67108864">
              </binding>
          </webHttpBinding>
</bindings>

最终工作版本(transferMode="Streamed" 被移除)

<bindings>
 <webHttpBinding>
<binding name="StreamedBinding" maxReceivedMessageSize="67108864" />
 </webHttpBinding>
</bindings>

服务帮助页面终于回来了。

但我不明白为什么它又回到了为什么它被关闭的原因。

无论如何,这是我的情况的有效解决方案。 希望有人会觉得它有帮助。

【讨论】:

【参考方案2】:

你说它停止工作是什么意思?在下面的示例中,服务仍会返回帮助页面(我尝试同时使用 IE 和 Chrome,它们都能看到该页面)。

    public class ***_5937029

    [ServiceContract]
    public interface ITest
    
        [WebGet]
        int Add(int x, int y);
    
    public class Service : ITest
    
        public int Add(int x, int y)
        
            return x + y;
        
    
    static void SendRequest(string address)
    
        HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(address);
        req.Method = "GET";

        HttpWebResponse resp;
        try
        
            resp = (HttpWebResponse)req.GetResponse();
        
        catch (WebException e)
        
            resp = (HttpWebResponse)e.Response;
        

        Console.WriteLine("HTTP/0 1 2", resp.ProtocolVersion, (int)resp.StatusCode, resp.StatusDescription);
        foreach (string headerName in resp.Headers.AllKeys)
        
            Console.WriteLine("0: 1", headerName, resp.Headers[headerName]);
        

        Console.WriteLine();
        Stream respStream = resp.GetResponseStream();
        Console.WriteLine(new StreamReader(respStream).ReadToEnd());

        Console.WriteLine();
        Console.WriteLine("  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*  ");
        Console.WriteLine();
    
    public static void Test()
    
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
        WebHttpBehavior behavior = new WebHttpBehavior
        
            HelpEnabled = true
        ;
        WebHttpBinding binding = new WebHttpBinding
        
            TransferMode = TransferMode.Streamed
        ;
        host.AddServiceEndpoint(typeof(ITest), binding, "").Behaviors.Add(behavior);
        host.Open();
        Console.WriteLine("Host opened");

        SendRequest(baseAddress + "/Add?x=4&y=8");
        SendRequest(baseAddress + "/help");

        Console.Write("Press ENTER to close the host");
        Console.ReadLine();
        host.Close();
    

【讨论】:

查看更新,可能不仅仅是因为传输模式,而是配置设置中的一些基本内容 尝试从一个空的绑定配置开始,看看帮助页面是否仍然出现;如果没有,开始一次添加一个属性,直到添加一个导致它消失的属性。这应该会为您提供有关该问题的更多信息。

以上是关于将 transferMode 更改为“Streamed”后无法加载 wcf restful 帮助页面的主要内容,如果未能解决你的问题,请参考以下文章

服务器上的 PHP 文件上传将 mime-type 更改为 application/octet-stream

Stream将Java流转化成数组

Stream将Java流转化成数组

Stream将Java流转化成数组

将类集枚举更改为非类集枚举

使用 java 8 将一段时间更改为 IntStream