Проблемы с переносом пользовательского класса в WCF c # - PullRequest
1 голос
/ 31 мая 2019

Я передаю данные между сервером и клиентом. Клиент легко получает с сервера обычные типы данных, такие как int, но если вы передаете ему пользовательский класс, я получаю следующее исключение:

System.ServiceModel.CommunicationException: при получении ответа HTTP на * 1006 произошла ошибка. Вероятно, это связано с тем, что привязка конечной точки службы не использует протокол HTTP. Это также может быть вызвано тем, что контекст HTTP-запроса был прерван сервером (возможно, из-за того, что служба отключена). Подробнее смотрите в журналах сервера.

Я пробовал много решений для решения таких проблем, но ничего не помогло. Я добавил геттеры и сеттеры в поля классов, изменил DataContract и т. Д. На Serializable:

Пользовательский класс

    namespace c_CardStrategy
{
    [DataContract]
    public class Card
    {
        #region ПОЛЯ
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public string Effect { get; set; }
        [DataMember]
        public int ID { get; set; }
        [DataMember]
        public int Price { get; set; }
        [DataMember]
        public string EffText { get; set; }
        #endregion
        #region Конструктор
        public Card(int id, string name, string effect, int price, string efftext)
        {
            Price = price;
            ID = id;
            Name = name;
            Effect = effect;
            EffText = efftext;
        }
        public Card()
        {
            Name = "";
            Effect = "";
            ID = 0;
            Price = 0;
            EffText = "";
        }
        #endregion
    }

    [DataContract]
    public class Moster_Card : Card
    {
        [DataMember]
        public int? Health { get; set; }
        [DataMember]
        public int? Power { get; set; }

        public Moster_Card(int id, string name, int? health, int? power, string effect, int price, string efftext) : base(id, name, effect, price, efftext)
        {
            Health = health;
            Power = power;
        }
        public Moster_Card()
        {
            Name = "";
            Effect = "";
            ID = 0;
            Price = 0;
            EffText = "";
            Health = 0;
            Power = 0;
        }
    }

    [DataContract]
    public class Spell_Card : Card
    {
        [DataMember]
        public int? Charge { get; set; }

        public Spell_Card(int id, string name, string effect, int price, string efftext, int? charge) : base(id, name, effect, price, efftext)
        {
            Charge = charge;
        }
        public Spell_Card()
        {
            Name = "";
            Effect = "";
            ID = 0;
            Price = 0;
            EffText = "";
            Charge = 0;
        }
    }


}



Интерфейс

    [ServiceContract]
        public interface IGame
        {
            [OperationContract]
            Players GetPlayer(int grid);

            [OperationContract]
            List<Players> Players();

            [OperationContract]
            int GetTurn(int GameGrid);

            [OperationContract]
            void FindGame(Players Player);

            [OperationContract]
            object GetAllCards();

            [OperationContract]
            List<Card> GetDeckOnCode(string code_deck);

            [OperationContract]
            bool Checkuser(string login, string pass);

            [OperationContract]
            void WriteInLog(string Text);
        }


Сервер

    namespace c_CardStrategy
    {
        [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
        public class GameServer : IGame
        {
            private List<Players> listPlayers;
            private List<Game> Games;
            public hpartner_cgEntities context;
            ...
            public object GetAllCards()
            {
                context = new hpartner_cgEntities();
                List<Card> Cards = new List<Card>();
                foreach(var Card in context.Cards)
                {
                    int id = Card.Card_id;
                    string name = Card.Card_name;
                    int f = Card.Card_eff_id;
                    string eff;
                    switch (f)
                    {
                        case 0:
                            eff = "None";
                            break;
                        case 1:
                            eff = "Taunt";
                            break;
                        case 2:
                            eff = "Charge";
                            break;
                        default:
                            eff = "None";
                            break;
                    }
                    int price = Card.Card_price;
                    string efftext = Card.Card_eff_text;
                    int? Health = Card.Card_health;
                    int? Power = Card.Card_power;
                    int? Charge = Card.Charge;
                    if (Health != null)
                    {
                        Cards.Add(new Spell_Card(id, name, eff, price, efftext, Charge));
                    }
                    else
                    {
                        Cards.Add(new Moster_Card(id, name, Health, Power, eff, price, efftext));
                    }
                }
                return Cards;
            }
            ...
    }
    }

Клиент

    public partial class DecksWindow : Window
        {
            private GameClient Client;
            public DecksWindow(GameClient client)
            {
                InitializeComponent();
                Client = client;
            }

            private void New_deck_Click(object sender, RoutedEventArgs e)
            {
                Deck_list.Visibility = Visibility.Visible;
                List<Card> Cards = new List<Card>();
                try
                {
                    Cards = Client.GetAllCards() as List<Card>;
                    foreach (Card Card in Cards)
                    {
                        StackPanel Sp = new StackPanel();
                        Sp.Height = 170;
                        Sp.Width = 150;
                        Sp.Margin = new Thickness(0, 5, 5, 0);
                        Sp.Background = Brushes.Red;
                        Sp.Tag = Card.IDk__BackingField.ToString();
                        Sp.Uid = 2.ToString();
                        Deck_list.Children.Add(Sp);
                    }
                }
                catch (Exception ex)
                {
                    tb.Text += ex.Message;
                }
                //tb.Text = Client.Checkuser("Admin", "Admin").ToString();

            }
        }

Конфигурационный клиент

    <configuration>
      <configSections>
        <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
      </configSections>
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
      </startup>
      <entityFramework>
        <defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6" />
        <providers>
          <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.EntityFramework" />
        </providers>
      </entityFramework>
      <connectionStrings>
        <add name="hpartner_cgEntities" providerName="System.Data.EntityClient" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=MySql.Data.MySqlClient;provider connection string=&quot;server=hpartnerlink.ru;user id=hpartner;password=M7gn46Wx3b;persistsecurityinfo=True;database=hpartner_cg&quot;" />
      </connectionStrings>
      <system.web>
        <httpRuntime maxRequestLength="262144"  executionTimeout="103600"/>
      </system.web>
      <system.serviceModel>
        <bindings>
          <basicHttpBinding>
            <binding name="BasicHttpBinding_IGame" />
            <binding name="BasicHttpBinding_IGame1" />
          </basicHttpBinding>
        </bindings>
        <client>
          <endpoint address="http://127.0.0.1:8000/Service" binding="basicHttpBinding"
            bindingConfiguration="BasicHttpBinding_IGame" contract="GameServiceReference.IGame"
            name="BasicHttpBinding_IGame" />
          <endpoint address="http://0.0.0.0:8000/Service" binding="basicHttpBinding"
            bindingConfiguration="BasicHttpBinding_IGame1" contract="ServiceReference1.IGame"
            name="BasicHttpBinding_IGame1" />
        </client>
      </system.serviceModel>

Config Server

    <configSections>
        <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
      </configSections>
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
      </startup>
      <entityFramework>
        <defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6" />
        <providers>
          <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.EntityFramework" />
        </providers>
      </entityFramework>
      <connectionStrings>
        <add name="hpartner_cgEntities" providerName="System.Data.EntityClient" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=MySql.Data.MySqlClient;provider connection string=&quot;server=hpartnerlink.ru;user id=hpartner;password=M7gn46Wx3b;persistsecurityinfo=True;database=hpartner_cg&quot;" />
      </connectionStrings>
      <system.serviceModel>
        <behaviors>
          <serviceBehaviors>
            <behavior name="debug">
              <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
        <services>
          <service name="MyServiceName" behaviorConfiguration="debug" />
        </services>
      </system.serviceModel>

1 Ответ

0 голосов
/ 03 июня 2019

Можете ли вы получить доступ к WSDL веб-службы после размещения службы? Я сомневаюсь, что конфигурация может быть слишком простой. Я предлагаю вам применить приведенную ниже конфигурацию на стороне сервера.

  <system.serviceModel>
    <services>
      <service name="YourNamespace.GameServer " behaviorConfiguration="mybehavior">
        <endpoint address="http://localhost:8000/Service" binding="basicHttpBinding" contract="YourNamespace.IGame " ></endpoint>
        <endpoint address="http://localhost:8000/Service/mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
      </service>
    </services>    
    <behaviors>
      <serviceBehaviors>
        <behavior name="mybehavior">
          <serviceMetadata httpsGetEnabled="true" httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

После размещения службы мы можем получить доступ к информации службы, введя адрес службы в адресной строке браузера.

http://localhost:8000/service

Кроме того, нам может потребоваться административная привилегия при размещении службы. Не стесняйтесь, дайте мне знать, если проблема все еще существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...