小编use*_*186的帖子

大二进制(byte [])通过WCF传输文件

我正在尝试构建一个WCF服务,允许我从客户端向服务发送大型二进制文件.

但是我只能成功传输高达3-4MB的文件.(当我尝试转移4.91MB时,我失败了,当然,除了之外)

如果我尝试发送4.91MB文件,我得到的错误是:

异常消息:接收到http:// localhost:56198/Service.svc的HTTP响应时发生错误.这可能是由于服务端点绑定不使用HTTP协议.这也可能是由于服务器中止HTTP请求上下文(可能是由于服务关闭).请参阅服务器日志以获取更多详

内部异常消息:基础连接已关闭:接收上发生意外错误.

内部异常消息:无法从传输连接读取数据:远程主机强制关闭现有连接.

内部异常消息:远程主机强制关闭现有连接

一旦将byte []文件作为方法参数发送到公开的服务方法,就会在客户端发生此错误.

我在服务方法的第一行有一个断点,如果文件传输成功(低于3MB),则会触发断点并传输文件.但是在这种情况下,只要调用该方法,就会出现错误.如果出现此错误,则不会触发服务中的断点.

我将粘贴我的Service Web.config和Asp Page(Client)Web.config的各个部分.如果您还需要发送文件并接受文件的代码,请告诉我,我也会发送该文件.

服务Web.Config

<system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="basicHttpEndpointBinding" closeTimeout="01:01:00"
      openTimeout="01:01:00" receiveTimeout="01:10:00" sendTimeout="01:01:00"
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
      maxBufferSize="2147483646" maxBufferPoolSize="2147483646" maxReceivedMessageSize="2147483646"
      messageEncoding="Mtom" textEncoding="utf-8" transferMode="StreamedRequest"
      useDefaultWebProxy="true">
      <readerQuotas maxDepth="2147483646" maxStringContentLength="2147483646" maxArrayLength="2147483646"
        maxBytesPerRead="2147483646" maxNameTableCharCount="2147483646" />
      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None"
          realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>        
  </basicHttpBinding>      
</bindings>
    <services>
        <service behaviorConfiguration="DragDrop.Service.ServiceBehavior" name="DragDrop.Service.Service">
            <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpEndpointBinding" contract="DragDrop.Service.IService">
                <identity>
                    <dns value="localhost"/>
                </identity>
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> …
Run Code Online (Sandbox Code Playgroud)

.net c# asp.net wcf basichttpbinding

21
推荐指数
3
解决办法
6万
查看次数

在C#中以编程方式创建WCF客户端的标头(wsse)部分

如何以编程方式在app #config中创建app.config服务设置的以下部分:

    <client>
  <endpoint address="https://someServiceUrl"
      binding="basicHttpBinding" bindingConfiguration="Contact"
      contract="ServiceReference.PostingWebService" name="PostingWebServicePort">
    <headers>
      <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
        <wsse:UsernameToken>
          <wsse:Username>someusername</wsse:Username>
          <wsse:Password Type='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText'>somepassword</wsse:Password>
        </wsse:UsernameToken>
      </wsse:Security>
    </headers>
  </endpoint>
</client>
Run Code Online (Sandbox Code Playgroud)

我已设法从c#生成绑定部分(上面未包含)和端点部分.我无法创建标题部分.

出现的错误是:(这是因为当我从c#生成所有内容时,我没有标题部分)

这项服务需要<wsse:Security>,但缺少.

header部分很重要,好像我从配置中排除它并使用config运行代码它也会产生上述错误.

我不想使用web.config/app.config.我必须从C#运行所有东西.(上面的app.config工作正常,但我想通过c#做同样的事情)

注意:下面的更新是基于以下提供的解决方案请通过以下解决方案的评论,以获得更好的理解

更新1 :(首先以编程方式使用BasicHttpBinding)

BasicHttpBinding binding = new BasicHttpBinding();
        binding.Name = "Contact";
        binding.CloseTimeout = TimeSpan.FromMinutes(1);
        binding.OpenTimeout = TimeSpan.FromMinutes(1);
        binding.ReceiveTimeout = TimeSpan.FromMinutes(10);
        binding.SendTimeout = TimeSpan.FromMinutes(1);
        binding.AllowCookies = false;
        binding.BypassProxyOnLocal = false;
        binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
        binding.MaxBufferSize = 524288;
        binding.MaxBufferPoolSize = 524288;
        binding.MaxReceivedMessageSize = 524288;
        binding.MessageEncoding = WSMessageEncoding.Text;
        binding.TextEncoding = System.Text.Encoding.UTF8;
        binding.TransferMode = TransferMode.Buffered;
        binding.UseDefaultWebProxy = …
Run Code Online (Sandbox Code Playgroud)

c# wcf ws-security wcf-security

10
推荐指数
2
解决办法
2万
查看次数

尝试 - 赶上回归策略

try-catch在方法中使用时,如果您希望应用程序即使出现错误也能继续,是否可以通过catch块返回默认值作为return,并记录错误以供日后查看?

例如:

public static string GetNameById(int id)
{
    string name;
    try
    {
        //Connect to Db and get name - some error occured
    }
    catch(Exception ex)
    {
        Log(ex);
        name = String.Empty;
    }

    return name;
}
Run Code Online (Sandbox Code Playgroud)

例2:

public static string GetIdByName(string name)
{
    int id;
    try
    {
        //Connect to Db and get id- some error occured
    }
    catch(Exception ex)
    {
        Log(ex);
        id = 0;
    }

    return id;
}
Run Code Online (Sandbox Code Playgroud)

是否可以返回任何默认值(取决于方法的返回类型...... ???),以便需要此方法的结果的应用程序逻辑不会崩溃并继续...

提前致谢...

问候.

c# asp.net

5
推荐指数
2
解决办法
6505
查看次数

标签 统计

c# ×3

asp.net ×2

wcf ×2

.net ×1

basichttpbinding ×1

wcf-security ×1

ws-security ×1