C# 如何在basicHttpBinding中将SOAP WCF与网站相结合
好的,情况是这样的,我想将exist WCF服务添加到exist asp.net网站,但我遇到了一个令人头痛的问题: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
- 我有一个SOAPWCF服务发送大文件流,它工作得很好
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演示网站结合起来
<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";