1

これは私の WCF REST OperationContract です

 [OperationContract(Name = "SaveBasicInfoObjectById")]
     [WebInvoke(Method = "POST",
          ResponseFormat = WebMessageFormat.Xml,
          RequestFormat = WebMessageFormat.Xml,
         BodyStyle = WebMessageBodyStyle.Bare,
         UriTemplate = "Core/SaveBasicInfoObjectById?ID={ID}")]
     List<Response> SaveBasicInfoObjectById(string ID, BasicClass basicClass);

これは私のクライアントコードです

  string ID= "123";

  MyService.BasicClass basicClass = new MyService.BasicClass();


  string sErrorMsg = "";
  string sResponseStatus = "";
string URLString = "http://localhost:59133/MyService.svc/Core/SaveBasicInfoObjectById?ID=" + ID;


basicClass.FirstName = txt_Fname.Text.Trim();
basicClass.Lastname = txt_Lname.Text.Trim();

var paramContent = Serialize(basicClass);

CreateWebRequest(URLString, paramContent.ToString());

これがシリアル化メソッドです

    public static string Serialize<T>(T obj)
    {

        var serializer = new System.Xml.Serialization.XmlSerializer(obj.GetType());
        var ms = new MemoryStream();
        serializer.Serialize(ms, obj);
        string retVal = Encoding.Default.GetString(ms.ToArray());
        ms.Dispose();
        return retVal;

    }

これは CreateWebRequest メソッドです

    private string CreateWebRequest(string endPoint, string paramContent)
    {
        string result = string.Empty;

        byte[] buffer = Encoding.UTF8.GetBytes(paramContent);
        var myHttpWebRequest = (HttpWebRequest)WebRequest.Create(endPoint);

        myHttpWebRequest.Method = "POST";
        myHttpWebRequest.ContentLength = buffer.Length;
        myHttpWebRequest.ContentType = "text/xml";

        using (var request = myHttpWebRequest.GetRequestStream())
        {
            request.Write(buffer, 0, buffer.Length);
            request.Close();
        }

        var myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
        using (var reader = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding.UTF8))
        {
            result = reader.ReadToEnd();
            myHttpWebResponse.Close();
        }


        return result;
    }

*ここで私が直面している問題は、オブジェクトが次の形式でシリアル化されていることです。ブレークポイントがサービスでヒットすると、オブジェクトの値は空になります。つまり、firstname = "" および lastname = "" *

<?xml version="1.0"?>
 <BasicClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ID="0">
<FirstName xmlns="http://tempuri.org/">James</FirstName>
<Lastname xmlns="http://tempuri.org/">Kravis</Lastname>
</BasicClass>

なぜこれが起こっているのか、誰にでもアドバイスできますか?

tempuri 名前空間を firstname および lastname 要素に対して "" または空に置き換えました。これで機能し、クライアントからの値がサービスで受信されるようになりました。

以下は、serialize メソッドの更新されたコードです。

public  string Serialize<T>(T obj)
    {
        //System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(p.GetType());
        var serializer = new System.Xml.Serialization.XmlSerializer(obj.GetType());
        var ms = new MemoryStream();
        serializer.Serialize(ms, obj);
        string retVal = Encoding.Default.GetString(ms.ToArray());
        ms.Dispose();
        return retVal.Replace("xmlns=\"http://tempuri.org/\"", "");
    }

** 上記のコードを更新 **

public  string Serialize<T>(T obj)
    {
        var serializer = new System.Xml.Serialization.XmlSerializer(obj.GetType());
        var ms = new MemoryStream();
        serializer.Serialize(ms, obj);
        string retVal = Encoding.Default.GetString(ms.ToArray());
        ms.Dispose();
        return retVal;
    }

** 置換を取り除き、デフォルトの名前空間が要素に追加されるのを止める方法を見つけました **

public class BasicClass
{
    [XmlElement(Namespace="")]//add namespace as ""
    public string Firstname{get;set;}

    [XmlElement(Namespace="")]//add namespace as ""
    public string Lastname{get;set;}
}

上記のようにすることで、デフォルトの名前空間を削除でき、置き換える必要はありません

<?xml version="1.0"?>
 <BasicClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ID="0">
<FirstName>James</FirstName>
<Lastname>Kravis</Lastname>
</BasicClass>
4

1 に答える 1

1

デフォルトでは、WCFはシリアライザーDataContractSerializerとしてではなくを使用しますXmlSerializer。それらは異なる形式を生成する(そして期待する)ので、クライアント(XmlSerializerの代わりにDataContractSerializerを使用してオブジェクトをシリアル化する)またはサービス([XmlSerializerFormat]WCFにそのシリアライザーを使用させるために操作またはサービスコントラクトのいずれかに属性を適用する)のいずれかを変更する必要があります)。

また、「xmlns」宣言(Serialize<T>メソッドの最後の行)を置き換えないでください。これを行うと、生成されるXMLのセマンティクスが変更されるためです。

于 2012-05-16T23:50:19.143 に答える