wcfに関連することを初めて書いています。ドキュメントなどに従ってすべてを行いましたが、クライアントがサービスからデータを受信したくない理由がわかりません。さらに、それはデータのみを受け入れ、サービス自体からクライアントのメソッドを呼び出しません。これは、一方向の wsHttpBinding があることを意味しますか?
タスクは次のとおりです。サービスはクライアントからマトリックス サイズ (5x5) とマトリックス自体の生成方法を決定する列挙型識別子を受け取り、指定された次元のランダムなマトリックスがサーバー上で生成されMatrix <double>
、クライアントに返されます。次に、このマトリックスは、操作のためにサービスに再度転送されます。問題は、マトリックスがクライアントに返され、エラーが GetMatrix メソッドが呼び出される行にあるときに、次のメッセージが表示されることです。
http://localhost:8080/WCF_TRSPO/Service1/への HTTP 応答の受信中にエラーが発生しました。これは、サービス エンドポイント バインディングが HTTP プロトコルを使用していないことが原因である可能性があります。
ServiceTrace は私にそのエラーを言います:
To ' http://localhost:8080/WCF_TRSPO/Service1/mex/mex ' を含むメッセージは、EndpointDispatcher での AddressFilter の不一致により、受信側で処理できません。送信者と受信者の EndpointAddresses が一致していることを確認してください。
クライアントにマトリックスではなくnullを渡すと、クライアントはそれを受け入れます。5x5 マトリックスは拒否します。同様に、Vector <double>
. 何が問題なのかわかりません。Google 検索で結果が返されませんでした。どこを見ればいいのか、どこが間違っていたのか、指示を出してください。)
サービス App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
<compilation debug="true" />
</system.web>
<system.serviceModel>
<services>
<service behaviorConfiguration="ServiceBehavior" name="WCF_TRSPO_Lib.Service1">
<endpoint address="" binding="wsHttpBinding" contract="WCF_TRSPO_Lib.IService1">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/WCF_TRSPO/Service1/" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
クライアント App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IService1" />
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:8080/WCF_TRSPO/Service1/"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService1"
contract="ServiceReference1.IService1" name="WSHttpBinding_IService1">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
</client>
</system.serviceModel>
</configuration>
サービスインターフェース
[ServiceContract]
public interface IService1
{
[OperationContract]
ObjectObgortka GetMatrixData(int n, MatrixEnum Letter);
データ セットがクライアントに返されるサービス データ ソース
[DataContract]
public class ObjectObgortka
{
public ObjectObgortka()
{
_Matrix = null;
_Vector = null;
}
public Matrix<double> _Matrix;
public Vector<double> _Vector;
[DataMember]
public Matrix<double> Matrix { get { return _Matrix; } set { _Matrix = value; } }
[DataMember]
public Vector<double> Vector { get { return _Vector; } set { _Vector = value; } }
サービス
public class Service1 : IService1
{
public ObjectObgortka GetMatrixData(int n, MatrixEnum Letter)
{
MatrixFactory matrixFactory = new MatrixFactory();
ObjectObgortka obgortka = new ObjectObgortka();
Console.WriteLine(n);
obgortka.Matrix = matrixFactory.GetMatrix(Letter, n);
//obgortka.Matrix = null;
return obgortka;
}
とクライアント
public static void Main(string[] args)
{
//Step 1: Create an instance of the WCF proxy.
Service1Client client = new Service1Client();
// Step 2: Call the service operations.
// Call the Add service operation.
Console.Write("N: ");
int n = Convert.ToInt32(Console.ReadLine());
var matrixA = client.GetMatrixData(n, MatrixEnum.A); //here var is ObjectObgortka type from Servic
Matrix<double> MatrixA = matrixA.Matrix;