Я столкнулся с той же проблемой, и я считаю, что есть несколько способов, которые вы можете рассмотреть, как это сделать.Если есть еще, я бы хотел услышать их от других.
Сначала я расскажу вам, как я это сделал.Шаг первый - создать служебную библиотеку, которая содержит определение класса для вашей структуры объекта данных с соответствующими методами get и конструктором для инициализации объекта.Кроме того, вы должны сделать сериализуемый класс, т. Е.
[Serializable]
public class myDataObject
{
private int _n1;
private string _s1;
public myDataObject(int n, string s)
{
this._n1 = n;
this._s1 = s;
}
public int getN1()
{
return this._n1;
}
public string getS1()
{
return this._s1;
}
}
}
Важно поместить это в библиотеку, чтобы вы могли ссылаться на него как со стороны клиента, так и со стороны сервера.
Как только вы это сделаете, измените свой метод обслуживания WCF, чтобы он выглядел примерно так:
[WebInvoke(Method = "POST", UriTemplate = "yourDesignedURI")]
[OperationContract]
public bool doSomething(myDataObject o)
{
//implement your service logic, accessing the parameters from o
int i = o.getN1();
string s = o.getS1();
//...etc
return true;
}
Когда это будет завершено, опубликуйте свою службу, а затем используйте страницу справки из своей службы, чтобыпросмотреть синтаксис XML, который требуется.Затем вы можете создать свой XML с помощью Linq to XML и, таким образом, отправить ваш объект данных через Интернет в качестве запроса.Это устраняет необходимость в переносе и предоставляет синтаксис вашего запроса XML:
<myDataObject xmlns="http://schemas.datacontract.org/2004/07/DemoXMLSerialization">
<_n1>2147483647</_n1>
<_s1>String content</_s1>
</myDataObject>
Ссылка на библиотеку утилит в вашем клиенте и создание метода в ваших данных позже для вызова метода service, создавая элемент в вашем методе.
public void callService(int n1, string s1)
{
myDataObject o = new myDataObject(n1, s1);
string serviceURL = "yourBaseURL";
string serviceURI = "yourDesignedURI";
using (HttpClient client = new HttpClient(serviceURL))
{
client.DefaultHeaders.Add("Content-Type", "application/xml; charset=utf-8");
XNamespace xns = "http://schemas.datacontract.org/2004/07/DemoXMLSerialization";
XDocument xdoc = new XDocument(
new XElement(xns + "myDataObject",
new XElement(xns + "_n1", o.getN1())
, new XElement(xns + "_s1", o.getS1())));
using (HttpResponseMessage res = client.Post(serviceURI, HttpContent.Create(xdoc.ToString(SaveOptions.DisableFormatting))))
{
res.EnsureStatusIsSuccessful();
//do anything else you want to get the response value
}
}
}
Еще одна вещь, которую вы можете сделать, это изменить ваш URI, чтобы он выглядел примерно так: yourdesignedURI / {myInt} / {myString}
, а затем используйте сериализацию JSON для отправки объекта.Если вы добавите строку
BodyStyle=WebMessageBodyStyle.Bare
в свой атрибут WebInvoke, страница справки предоставит полный URI для удобства просмотра.
Я уверен, что, возможно, есть способ сделать это с JQueryтакже.Хотелось бы увидеть другие решения этой проблемы!
Надеюсь, это поможет.