Webサービスにアクセスしようとしています(これもWCFを使用してコーディングされていると思いますが、制御できません)。例外が発生します。
System.ServiceModel.FaultException:WSE012:次の情報が欠落しているため、入力は有効なSOAPメッセージではありませんでした:アクション。
サーバースタックトレース:
at System.ServiceModel.Channels.ServiceChannel.HandleReply(
ProxyOperationRuntime operation, ProxyRpc& rpc)
at System.ServiceModel.Channels.ServiceChannel.Call(String action,
Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs,
TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(
IMethodCallMessage methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
[0]で再スローされた例外:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(
IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(
MessageData& msgData, Int32 type)
at ClientName.ProjectName.Services.ServiceName.ServiceNameSoap.CallServiceName(
Request request)
at ClientName.ProjectName.Scheduler.ThirdPartyName.ProcessServiceName.Execute(
Object state) in ...\ProcessServiceName.cs:line 65
の呼び出しコードは次のProcessServiceName.Execute
とおりです。
Request serviceRequest = request.BuildServiceRequest();
Result result = client.CallServiceName(serviceRequest);
LogServiceErrors(db, request.ServiceNameRequestId, result.errors);
例外は、サービスリファレンスによって自動生成されたWCFコードを直接呼び出して;を呼び出す2番目の行から発生します。このメソッドは、データベースオブジェクトを取得し、それをWebサービスに必要なオブジェクトに変換するだけです。System.ServiceModel.ClientBase<T>. Channel
.CallServiceName(request)
BuildServiceRequest
App.config
(これはWindowsサービス内で呼び出されます)の関連部分は次のとおりです。
<system.serviceModel>
<bindings>
<webHttpBinding>
<binding name="webBinding">
</binding>
</webHttpBinding>
<wsHttpBinding>
<binding name="ThirdPartySoap" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00"
sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false"
hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288"
maxReceivedMessageSize="65536" messageEncoding="Text"
textEncoding="utf-8" useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192"
maxArrayLength="16384" maxBytesPerRead="4096"
maxNameTableCharCount="16384"/>
<security mode="Transport">
<transport clientCredentialType="Basic" proxyCredentialType="None"
realm="www.serviceprovider.com"/>
<message clientCredentialType="UserName"
algorithmSuite="Default"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint name="ServiceNameSoap"
address="https://www.serviceprovider.com/ServiceName.asmx"
binding="wsHttpBinding" bindingConfiguration="ThirdPartySoap"
contract="ServiceName.ServiceNameSoap"/>
</client>
</system.serviceModel>
実際のWebサービス作業を行うすべてのコードがWCF内からのものであることを考えると、問題が何であるかはよくわかりませんが、おそらく、App.config
それを防ぐために少し異なるものが必要です。
グーグルを見て、私は何の助けも見つけていません。StackOverflowでは、2011年9月のこの未回答のWCFの質問は役に立ちません。カスタムバインディング(2009年11月の回答とWSEに関するリンク)は役に立ちません(そして私はそれらをほとんど理解していません) 。 2009年11月のフォーラムの回答と2009年10月のColdFusionの回答はどちらも無関係です。私が見ている他のすべてのGoogleヒットは、これらのリンクの複製です。
どんな援助も大歓迎です!
編集して詳細を追加
Wiktor Zychlaは、問題は(理論的には)プロキシクラスにある可能性があることを正しく指摘しています。ただし、これらのクラスは、自動的に生成されたクラスから完全に編集されていません。例えば:
using System.CodeDom.Compiler;
using System.ServiceModel;
using System.ServiceModel.Channels;
namespace ClientName.ProjectName.Services.ServiceName
{
[GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
public interface ServiceNameSoapChannel : ServiceNameSoap, IClientChannel {}
[System.Diagnostics.DebuggerStepThroughAttribute()]
[GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
public partial class ServiceNameSoapClient : ClientBase<ServiceNameSoap>,
ServiceNameSoap
{
public ServiceNameSoapClient() { }
public ServiceNameSoapClient(string endpointConfigurationName) :
base(endpointConfigurationName) { }
public ServiceNameSoapClient(string endpointConfigurationName,
string remoteAddress) :
base(endpointConfigurationName, remoteAddress) { }
public ServiceNameSoapClient(string endpointConfigurationName,
EndpointAddress remoteAddress) :
base(endpointConfigurationName, remoteAddress) { }
public ServiceNameSoapClient(Binding binding,
EndpointAddress remoteAddress) : base(binding, remoteAddress) { }
public Result CallServiceName(Request request)
{ return base.Channel.CallServiceName(request); }
}
}
他のすべてのプロキシクラスも同様に自動生成されたコードから編集されていません(空白と名前空間の最適化のためにここで編集したので、StackOverflow内の画面によりよく適合します;using
ステートメントを追加した3つの名前空間はすべてで完全に修飾されていますClientName.ProjectName.Services.ServiceName
これらのサンプルで編集した名前空間と同様に、クラス参照。
WCFメッセージログを追加すると、メッセージログに次のように表示されます。(これは上記のコードとは異なるサービス呼び出しからのものですが、同じ例外をスローします。これは、このサービス呼び出しが単純であるため、何らかの理由ですべてのサービス呼び出しがログに記録されていないためです。私が行った唯一の編集は、水平スクロールなしで読みやすいエラーメッセージ。)
<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
<System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system">
<EventID>0</EventID>
<Type>3</Type>
<SubType Name="Information">0</SubType>
<Level>8</Level>
<TimeCreated SystemTime="2013-01-18T12:00:04.7166250Z" />
<Source Name="System.ServiceModel.MessageLogging" />
<Correlation ActivityID="{00000000-0000-0000-0000-000000000000}" />
<Execution ProcessName="ClientName.ProjectName.Scheduler" ProcessID="8600" ThreadID="10" />
<Channel/>
<Computer>MachineNameRedacted</Computer>
</System>
<ApplicationData>
<TraceData>
<DataItem>
<MessageLogTraceRecord Time="2013-01-18T12:00:04.7166250+00:00" Source="TransportSend" Type="System.ServiceModel.Dispatcher.OperationFormatter+OperationFormatterMessage" xmlns="http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace">
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
<a:Action s:mustUnderstand="1">http://www.serviceprovider.com/RedactedActionName</a:Action>
<a:MessageID>urn:uuid:395d6394-5f4b-4954-8df0-8fb82d17072a</a:MessageID>
<a:ReplyTo>
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
</a:ReplyTo>
<a:To s:mustUnderstand="1">https://www.serviceprovider.com/ServiceName.asmx</a:To>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<RedactedActionName xmlns="http://www.serviceprovider.com">
<brandId>2</brandId>
</RedactedActionName>
</s:Body>
</s:Envelope>
</MessageLogTraceRecord>
</DataItem>
</TraceData>
</ApplicationData>
</E2ETraceEvent>
<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
<System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system">
<EventID>0</EventID>
<Type>3</Type>
<SubType Name="Information">0</SubType>
<Level>8</Level>
<TimeCreated SystemTime="2013-01-18T12:00:04.7635000Z" />
<Source Name="System.ServiceModel.MessageLogging" />
<Correlation ActivityID="{00000000-0000-0000-0000-000000000000}" />
<Execution ProcessName="ClientName.ProjectName.Scheduler" ProcessID="8600" ThreadID="10" />
<Channel/>
<Computer>MachineNameRedacted</Computer>
</System>
<ApplicationData>
<TraceData>
<DataItem>
<MessageLogTraceRecord Time="2013-01-18T12:00:04.7635000+00:00" Source="TransportReceive" Type="System.ServiceModel.Channels.BufferedMessage" xmlns="http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace">
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing">
<env:Header xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<wsa:Action>http://schemas.xmlsoap.org/ws/2004/08/addressing/fault</wsa:Action>
<wsa:MessageID>urn:uuid:b72c6f30-8409-4b55-8c79-056d82f990a5</wsa:MessageID>
<wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To>
</env:Header>
<soap:Body>
<soap:Fault>
<soap:Code>
<soap:Value>soap:Sender</soap:Value>
</soap:Code>
<soap:Reason>
<soap:Text xml:lang="en">
WSE012: The input was not a valid SOAP message because
the following information is missing: action.
</soap:Text>
</soap:Reason>
</soap:Fault>
</soap:Body>
</soap:Envelope>
</MessageLogTraceRecord>
</DataItem>
</TraceData>
</ApplicationData>
さらに詳細:ServiceNameSoapインターフェース
Wiktor Zychlaが要求したように、自動生成されたコードからのインターフェイスServiceNameSoap
宣言は、画面にぴったり合うように(したがってusing
)、クライアントの機密名を編集するためにのみ編集されています。
using System.ServiceModel;
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel","4.0.0.0")]
[ServiceContractAttribute(Namespace="https://www.serviceprovider.com/",
ConfigurationName="ServiceName.ServiceNameSoap")]
public interface ServiceNameSoap
{
[OperationContractAttribute(
Action="https://www.serviceprovider.com/ServiceName",
ReplyAction="*")]
[XmlSerializerFormatAttribute(SupportFaults=true)]
[ServiceKnownTypeAttribute(typeof(ClientRequest))]
[return: MessageParameterAttribute(Name="result")]
ClientName.ProjectName.Services.ServiceName.Result CallServiceName(
ClientName.ProjectName.Services.ServiceName.Request request);
}