отправить json в службу wcf

126
15

Хорошо, я работаю над этим в течение нескольких дней, и это начинает раздражать меня.

У меня есть страница, где пользователь может изменить цветовую схему. И выберите логотип для страницы.

Использование jquery для округления всех элементов, которые можно изменить ($ (". Brand").)

и создайте данные и, наконец, отправите их в службу wcf как объект json, см. ниже

$(".brand").each(function () {
//use the title attribute to list the css properties
// you want for that element

//use the id with a prefix to represent the actual element
// you want to brand,
//matching up with the item in the site css

//prefix 'c-' = css class so replace with '.'
//prefix 'id-' = element id so replace with '#'
//prefix 'e-' = element so just remove the prefix

var id = $(this).attr("id").replace("c-", ".").replace("id-", "#").replace("e-", "");
var title = $(this).attr("title");
var values = title.split(',');
var property = "";
var value = "";
for (var i = 0; i < values.length; i++) {
selector = values[i]
value = $(this).css(values[i]);
}
var item = {};
item["id"] = "";
item["selector"] = id;
item["css_property"] = property;
item["property_value"] = value;
json.push(item);
});
if ($(".imgbase").val().length > 0) {
var logoUrl = $(".imgbase").val();
logoUrl = logoUrl.replace(new RegExp("^data:image/[a-z]*;base64,", ""));
var item = {};
item["id"] = 1;
item["selector"] = "";
item["css_property"] = "";
item["property_value"] = logoUrl;
json.push(item);
}

$.ajax({
type: "POST",
contentType: "application/json",
url: "http://localhost:64177/BrandingService.svc/DoBranding",
data: JSON.stringify({ CSS: json }),
dataType: "json",

success: function (msg) {
if (msg.hasOwnProperty("d"))
alert(msg.d);
},
error: function (result) {
alert("Failed to call service: (" + result.status + ") \n" + result.statusText);
}
});

Теперь это, кажется, создает объект массива, поэтому мой вопрос в том, что, на мой взгляд, должно случиться мое служение и как его прочитать? Предполагаю, что я правильно его отправляю? Если я получаю его как объект, ошибки нет, но служба не знает, что это такое и не может десериализовать его. Я не могу получить его как Список (BrandingCSS), это вызывает ошибку 500, у меня есть класс (см. Ниже), который я пытаюсь использовать в качестве списка (BrandingCSS), так как я могу получить " CSS Object "? Я пробовал JavaScriptSerializer и Json.net, я открыт для получения результата, поэтому, если кто-то может помочь, сделайте, прежде чем я сойду с ума.

    <OperationContract()>
Public Function DoBranding(ByVal CSS As Object) As String
Try
Return "FOO"

Catch ex As Exception
Return "BAR: " & ex.Message
End Try
End Function

Класс, который я использую

    <DataContract([Namespace]:="")> _
Public Class BrandingCSS
<DataMember>
Public Property ServiceID() As Integer
Get
Return m_ServiceID
End Get
Set(value As Integer)
m_ServiceID = value
End Set
End Property
Private m_ServiceID As Integer
<DataMember>
Public Property selector() As String
Get
Return m_selector
End Get
Set(value As String)
m_selector = value
End Set
End Property
Private m_selector As String
<DataMember>
Public Property css_property() As String
Get
Return m_property
End Get
Set(value As String)
m_property = value
End Set
End Property
Private m_property As String
<DataMember>
Public Property property_value() As String
Get
Return m_value
End Get
Set(value As String)
m_value = value
End Set
End Property
Private m_value As String
<DataMember>
Public ReadOnly Property logo() As Byte()
Get
Return img
End Get
End Property
Private img As Byte() = Nothing
Public Sub New()
Try
img = Convert.FromBase64String(property_value)
Catch ex As Exception
img = Nothing
End Try
End Sub
End Class

Если вы хотите увидеть раздел услуг в файле web.config, это

<system.serviceModel>
<services>
<service name="BrandingService">
<endpoint address="" behaviorConfiguration="BrandingServiceAspNetAjaxBehavior"
binding="webHttpBinding" contract="BrandingService" />
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="BrandingServiceAspNetAjaxBehavior">
<enableWebScript />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="5000000" />
</webServices>
</scripting>
</system.web.extensions>

и образец отправленного json здесь

"[
{\"id\":\"1\",\"selector\":\".mp-level\",\"css_property\":\"background\",\"property_value\":\"\"},
{\"id\":\"1\",\"selector\":\".mp-level\",\"css_property\":\"color\",\"property_value\":\"\"},
{\"id\":\"1\",\"selector\":\"#header\",\"css_property\":\"background\",\"property_value\":\"\"},
{\"id\":\"1\",\"selector\":\"#header\",\"css_property\":\"color\",\"property_value\":\"\"},
{\"id\":\"1\",\"selector\":\"#header\",\"css_property\":\"border-bottom-color\",\"property_value\":\"\"},
{\"id\":\"1\",\"selector\":\"headerinput\",\"css_property\":\"background\",\"property_value\":\"\"},
{\"id\":\"1\",\"selector\":\"headerbutton\",\"css_property\":\"background\",\"property_value\":\"\"},
{\"id\":\"1\",\"selector\":\"footer\",\"css_property\":\"background\",\"property_value\":\"\"},
{\"id\":\"1\",\"selector\":\"footer\",\"css_property\":\"color\",\"property_value\":\"\"}
]"

спросил(а) 2021-01-25T21:24:52+03:00 4 месяца, 4 недели назад
1
Решение
89

Прежде всего, добавьте

contentType: "application/json;charset=utf-8"

в заголовке запроса POST.

Я не видел RequestFormat = WebMessageFormat.Json в вашем контракте на обслуживание.

Код С#

[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "CSSBranding",
RequestFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare)]
string DoBranding(BrandingCSS[] css);

Обратите внимание, что ваш класс JSON и BrandingCSS должен иметь одинаковые параметры. Например, для "селектора" в JSON вы должны иметь свойство "selector" в классе BrandingCSS.

[DataContract(Namespace = "")]
public class BrandingCSS
{
[DataMember]
public string selector {get; set;}
[DataMember]
public string id {get; set;}
//Remaining properties here.
}

Надеюсь, вы поняли код С#.

EDIT Если вы хотите проверить, что JSON ваша служба должна принять, переопределите метод ToString() для вашего класса BrandingCSS.

public override string ToString()
{
JavaScriptSerializer js = new JavaScriptSerializer(); // Available in System.Web.Script.Serialization;
return js.Serialize(this);
}

Теперь сделаем объект класса BrandingCSS.

BrandingCSS bcss = new BrandingCSS();
string acceptedJson = bcss.ToString();
Console.WriteLine(acceptedJson);

или вы можете сделать временную операциюContract и вызвать эту строку кодов. Нажмите там точку перерыва и посмотрите JSON. После этого создайте JSON, который вы только что видели в отладчике и отправляете запрос. См. 500 Внутренняя ошибка сервера. , А также вы не указали свой файл Web.Config.

ответил(а) 2021-01-25T21:24:52+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема