Возвращать пользовательский класс из метода WCF?

Есть так много вопросов по этому поводу, но нет решения для моей проблемы. Я хочу вернуть пользовательский класс, который имеет ключ datacontract и его члены имеют ключ datamember. Я получаю эту ошибку во время тестирования;

Ошибка в WCF

Когда я вызываю его из приложения Windows Phone, он возвращает "Удаленный сервер не найден"

Возвращает not found, но запускает методы, которые возвращают типы void, bool, list.

 [OperationContract]
    BaseModel Login(string userName, string password);

[DataContract]
public class UserModel
{
    private int userID;
    [DataMember]
    public int UserID
    {
        get { return userID; }
        set { userID = value; }
    }

    private string userName;
    [DataMember]
    public string UserName
    {
        get { return userName; }
        set { userName = value; }
    }

    private string password;
    [DataMember]
    public string Password
    {
        get { return password; }
        set { password = value; }
    }

    private string email;
    [DataMember]
    public string Email
    {
        get { return email; }
        set { email = value; }
    }

    private int securityQuestionID;
    [DataMember]
    public int SecurityQuestionID
    {
        get { return securityQuestionID; }
        set { securityQuestionID = value; }
    }

    private string securityQuestionAnswer;
    [DataMember]
    public string SecurityQuestionAnswer
    {
        get { return securityQuestionAnswer; }
        set { securityQuestionAnswer = value; }
    }

    private string sex;
    [DataMember]
    public string Sex
    {
        get { return sex; }
        set { sex = value; }
    }

    private string gsmNo;
    [DataMember]
    public string GSMNo
    {
        get { return gsmNo; }
        set { gsmNo = value; }
    }

    private DateTime birthDate;
    [DataMember]
    public DateTime BirthDate
    {
        get { return birthDate; }
        set { birthDate = value; }
    }

    private string registeredDeviceUniqueID;
    [DataMember]
    public string RegisteredDeviceUniqueID
    {
        get { return registeredDeviceUniqueID; }
        set { registeredDeviceUniqueID = value; }
    }

    private string registrationType;
    [DataMember]
    public string RegistrationType
    {
        get { return registrationType; }
        set { registrationType = value; }
    }

    private string registeredDeviceType;
    [DataMember]
    public string RegisteredDeviceType
    {
        get { return registeredDeviceType; }
        set { registeredDeviceType = value; }
    }

    private string registeredApplication;
    [DataMember]
    public string RegisteredApplication
    {
        get { return registeredApplication; }
        set { registeredApplication = value; }
    }

    private DateTime registeredDate;
    [DataMember]
    public DateTime RegisteredDate
    {
        get { return registeredDate; }
        set { registeredDate = value; }
    }

    private string registeredGSM;
    [DataMember]
    public string RegisteredGSM
    {
        get { return registeredGSM; }
        set { registeredGSM = value; }
    }

    private string profilePictureURL;
    [DataMember]
    public string ProfilePictureURL
    {
        get { return profilePictureURL; }
        set { profilePictureURL = value; }
    }
}

[DataContract]
public class BaseModel
{
    private string errorMessage;
    [DataMember]
    public string ErrorMessage
    {
        get { return errorMessage; }
        set { errorMessage = value; }
    }

    private string informationMessage;
    [DataMember]
    public string InformationMessage
    {
        get { return informationMessage; }
        set { informationMessage = value; }
    }

    private string warningMessage;
    [DataMember]
    public string WarningMessage
    {
        get { return warningMessage; }
        set { warningMessage = value; }
    }

    private string succeedMessage;
    [DataMember]
    public string SucceedMessage
    {
        get { return succeedMessage; }
        set { succeedMessage = value; }
    }

    private object returnObject;
    [DataMember]
    public object ReturnObject
    {
        get { return returnObject; }
        set { returnObject = value; }
    }

    private bool isSucceed;
    [DataMember]
    public bool IsSucceed
    {
        get { return isSucceed; }
        set { isSucceed = value; }
    }
}

И метод есть;

public BaseModel Login(string userName, string password)
    {
        using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["conStr"].ConnectionString))
        {
            connection.Open();
            using (SqlCommand command = new SqlCommand("SELECT * FROM UserBaseInformations WITH (NOLOCK) Where UserName=@userName", connection))
            {
                command.Parameters.Add(new SqlParameter("@userName", userName));
                SqlDataAdapter adapter = new SqlDataAdapter();
                adapter.SelectCommand = command;
                DataTable dt = new DataTable();
                adapter.Fill(dt);
                DataSet ds = new DataSet();
                ds.Tables.Add(dt);
                connection.Close();
                if (dt.Rows.Count == 0)
                    return new BaseModel() { IsSucceed = false, ErrorMessage = "Geçersiz bir kullanıcı adı girdiniz." };
                else if (!dt.Rows[0]["Password"].ToString().Equals(password))
                    return new BaseModel() { IsSucceed = false, ErrorMessage = "Şifrenizi yanlış girdiniz." };
                else
                    return new BaseModel()
                    {
                        IsSucceed = true,
                        ReturnObject = new UserModel()
                        {
                            Email = dt.Rows[0]["Email"].ToString(),
                            Password = dt.Rows[0]["Password"].ToString(),
                            UserID = (int)dt.Rows[0]["UserID"],
                            UserName = dt.Rows[0]["UserName"].ToString(),
                            SecurityQuestionID = (int)dt.Rows[0]["SecurityQuestionID"],
                            SecurityQuestionAnswer = dt.Rows[0]["SecurityQuestionAnswer"].ToString()
                        }
                    };
            }
        }
    }

1 ответ

Я нашел решение.

Возврат типа объекта может быть проблемой в WCF, поэтому я изменил его на базовый класс для возврата моих классов и добавил атрибут KnownType в BaseModel.

Другие вопросы по тегам