大きな画像をアップロードするために使用したいwcfサービスがあります。ストリーミングが有効になっている基本的なhttpエンドポイントがあります。
現在、Windowsアプリケーションからこのサービスを呼び出すと、http 400が表示されます。不思議なことに、400エラー(ブレークポイントに到達)後もメソッドに入りますが、渡したストリームを読み取ることができません(uploadStream.ReadByte() -1を返します)
また、文字列を受け取り、テストのためだけに文字列を返すメソッドを作成しました。これは100%機能します。
私は多くの解決策の記事を読みましたが、nonは私の問題を解決しているようです。
Web.config
<system.web>
<httpRuntime
maxRequestLength="65536"
/>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="FileUploadServiceBinding" closeTimeout="04:01:00"
openTimeout="04:01:00" receiveTimeout="04:10:00" sendTimeout="04:01:00"
allowCookies="false" bypassProxyOnLocal="false"
hostNameComparisonMode="StrongWildcard"
maxBufferSize="2147483647" maxBufferPoolSize="2147483647"
maxReceivedMessageSize="2147483647"
messageEncoding="Mtom" textEncoding="utf-8"
transferMode="Streamed"
useDefaultWebProxy="true">
<security mode="None">
<transport clientCredentialType="None" />
</security>
<readerQuotas maxDepth="128"
maxStringContentLength="2147483647" maxArrayLength="2147483647"
maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
</binding>
</basicHttpBinding>
</bindings>
<services>
<service name="Smd.ThreeSixtyDataTransfer.ThreeSixtyDataTransferService">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="FileUploadServiceBinding"
contract="Smd.ThreeSixtyDataTransfer.IThreeSixtyDataTransferService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8732/ThreeSixtyDataTransferService/" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information,
set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="True"/>
<!-- To receive exception details in faults for debugging purposes,
set the value below to true. Set to false before deployment
to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
サービス
public class ThreeSixtyDataTransferService : IThreeSixtyDataTransferService
{
public RequestResponse AttachPhotoToDataItem(UploadMessage photo)
{
...
return new RequestResponse() { UploadSucceeded = true };
}
public string Test(string test)
{
return test;
}
}
[ServiceContract]
public interface IThreeSixtyDataTransferService
{
[OperationContract]
RequestResponse AttachPhotoToDataItem(UploadMessage photo);
[OperationContract]
string Test(string test);
}
[MessageContract]
public class UploadMessage
{
[MessageHeader(MustUnderstand = true)]
public Guid DataId { get; set; }
[MessageBodyMember(Order = 1)]
public Stream Stream { get; set; }
}
[MessageContract]
public class RequestResponse
{
[MessageBodyMember(Order = 1)]
public bool UploadSucceeded { get; set; }
}
クライアント
using (Stream uploadStream =new FileStream("D:\\Folder\\somefoto.jpg", FileMode.Open))
{
using (ThreeSixtyDataTransferService.ThreeSixtyDataTransferServiceClient threeSixtyDataTransferService = new ThreeSixtyDataTransferService.ThreeSixtyDataTransferServiceClient())
{
var test =threeSixtyDataTransferService.Test("Test");//works
threeSixtyDataTransferService.AttachPhotoToDataItem(Guid.NewGuid(), uploadStream);//400
}
}
私はどんな援助にも素晴らしいです