C# 如何在basicHttpBinding中将SOAP WCF与网站相结合

C# 如何在basicHttpBinding中将SOAP WCF与网站相结合,c#,asp.net,web-services,wcf,soap,C#,Asp.net,Web Services,Wcf,Soap,好的,情况是这样的,我想将exist WCF服务添加到exist asp.net网站,但我遇到了一个令人头痛的问题: 我有一个SOAPWCF服务发送大文件流,它工作得很好 FileUploadService.cs是这样的,接口配置良好 public class FileUploadService : IFileUploadService { private readonly string _path = Directory.GetCurrentDirectory() + \\shar

好的,情况是这样的,我想将exist WCF服务添加到exist asp.net网站,但我遇到了一个令人头痛的问题:

  • 我有一个SOAPWCF服务发送大文件流,它工作得很好
FileUploadService.cs是这样的,接口配置良好

public class FileUploadService : IFileUploadService
{
    private readonly string _path = Directory.GetCurrentDirectory() + \\sharedfiles\\";
    public string GetData(int value)
    {
        return string.Format("You entered: {0}", value);
    }
    public void UploadPocoStream(PocoStream pocoStream)
    {
        try
        {
            if (!Directory.Exists(_path))
            {
                Directory.CreateDirectory(_path);
            }
            using (FileStream outputStream = new FileStream(_path + pocoStream.FileName, FileMode.OpenOrCreate, FileAccess.Write))
            {
                pocoStream.Stream.CopyTo(outputStream);
                outputStream.Flush();
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex);
        }
    }
}
PocoStream是这样的:

[MessageContract]
public class PocoStream
{
    [MessageHeader]
    public string FileName { get; set; }

    [MessageBodyMember]
    public Stream Stream { get; set; }
}
  • 我将把WCF服务与exist演示网站结合起来
以下是服务器属性:

我将此添加到网站的web.config文件:

<system.serviceModel>
  <services>
    <service name="test1.FileUploadService">
      <host>
        <baseAddresses>
          <add baseAddress="http://localhost:2668/"/>
        </baseAddresses>
      </host>
      <!-- Service Endpoints -->
      <endpoint address="FileUploadService.svc" binding="basicHttpBinding"
                contract="test1.IFileUploadService" bindingConfiguration="haha" >
        <identity>
          <dns value="localhost"/>
        </identity>
      </endpoint>
      <!-- Metadata Endpoints -->
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    </service>
  </services>
  <behaviors>
    <serviceBehaviors>
      <behavior name="">
        <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
        <serviceDebug includeExceptionDetailInFaults="true"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <bindings>
    <basicHttpBinding>
      <binding name="haha" closeTimeout="0:10:00" 
               receiveTimeout="00:20:00" sendTimeout="00:20:00" maxBufferSize="65536" 
               maxReceivedMessageSize="2147483647000" transferMode="StreamedRequest"/>
    </basicHttpBinding>
  </bindings>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
</system.serviceModel>
和客户端的app.config:

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding name="BasicHttpBinding_IFileUploadService" closeTimeout="0:10:00" receiveTimeout="00:20:00" sendTimeout="00:20:00" maxBufferSize="65536" maxReceivedMessageSize="2147483647000" transferMode="StreamedRequest"/>
    </basicHttpBinding>
  </bindings>
    <client>
        <endpoint address="http://localhost:2668/FileUploadService.svc"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IFileUploadService"
            contract="ServiceReference1.IFileUploadService" name="BasicHttpBinding_IFileUploadService" />
    </client>
</system.serviceModel>

但结果是,一旦运行客户端,我在客户端收到了一个意外的400错误请求:

在服务器上执行以下操作:

我想我在配置文件中出错了。有人能帮忙吗?非常感谢

笔记:
  • 我可以成功创建文件,但它是空的
  • 我正在尝试使用“流”传输模式来上传大文件,而占用的内存很少
  • 我没有设置任何安全设置,该网站只是一个演示网站

  • 您应该使用customBinding而不是basicHttpBinding。它更具可定制性

    您可以使用此工具进行以下操作:

    然后,您只需配置HTTP(S)传输即可添加基本身份验证:

    <customBinding>
      <binding name="NewBinding0">
        <textMessageEncoding MessageVersion="Soap11" />
        <httpTransport maxReceivedMessageSize="2147483647000" transferMode="StreamedRequest" authenticationScheme="Basic" />
      </binding>
    </customBinding>
    

    然后确保在IIS Web应用程序中启用了基本身份验证。

    您应该使用customBinding而不是basicHttpBinding。它更具可定制性

    您可以使用此工具进行以下操作:

    然后,您只需配置HTTP(S)传输即可添加基本身份验证:

    <customBinding>
      <binding name="NewBinding0">
        <textMessageEncoding MessageVersion="Soap11" />
        <httpTransport maxReceivedMessageSize="2147483647000" transferMode="StreamedRequest" authenticationScheme="Basic" />
      </binding>
    </customBinding>
    

    然后确保在IIS Web应用程序中启用了基本身份验证。

    Uh。。。我是个新手。也许我重新配置时出错了,但仍然出现400错误。
    经过多次尝试后,仍然出现400错误<代码>它告诉我必须在httpTransport元素中使用“匿名”Add authenticationScheme=“Basic”来激活基本身份验证。这也可能是服务端权限的问题。只要调试服务,如果允许它写入服务器上的文件夹。。。我是个新手。也许我重新配置时出错了,但仍然出现400错误。
    经过多次尝试后,仍然出现400错误<代码>它告诉我必须在httpTransport元素中使用“匿名”Add authenticationScheme=“Basic”来激活基本身份验证。这也可能是服务端权限的问题。如果允许写入服务器上的文件夹,只需调试服务即可
    a.ClientCredentials.UserName.UserName = "UserName";
    a.ClientCredentials.UserName.Password = "Password";