【发布时间】:2015-06-26 04:38:52
【问题描述】:
我遇到了 WCF Restfull Webservice 的问题,问题出在一种方法上,其他方法正常工作,那么我认为这不是一般的配置问题。 我知道可能是什么问题,但实际上我不知道如何解决它。 该方法可以访问第三方网络服务以检索以下类的对象:
[DataContract]
public class DeviceData
{
[DataMember]
public int DeviceDataFull { get; set; }
[DataMember]
public string DeviceDataVersion { get; set; }
[DataMember]
public string DeviceDataModel { get; set; }
[DataMember]
public int DeviceDataZWave_Heal { get; set; }
[DataMember]
public string DeviceDataTemperature { get; set; }
[DataMember]
public string DeviceDataSkin { get; set; }
[DataMember]
public string DeviceDataSerial_Number { get; set; }
[DataMember]
public string DeviceDataFWD1 { get; set; }
[DataMember]
public string DeviceDataFWD1Token { get; set; }
[DataMember]
public string DeviceDataFWD2 { get; set; }
[DataMember]
public string DeviceDataFWD2Token { get; set; }
[DataMember]
public int DeviceDataMode { get; set; }
[DataMember]
public List<Section> DeviceDataSections { get; set; }
[DataMember]
public List<Room> DeviceDataRooms { get; set; }
[DataMember]
public List<Scene> DeviceDataScenes { get; set; }
[DataMember]
public List<DeviceItem> DeviceDataItems { get; set; }
[DataMember]
public List<Category> DeviceDataCategories { get; set; }
[DataMember]
public int DeviceDataIr { get; set; }
[DataMember]
public string DeviceDataIrtx { get; set; }
[DataMember]
public int DeviceDataLoadTime { get; set; }
[DataMember]
public int DeviceDataState { get; set; }
[DataMember]
public string DeviceDataComment { get; set; }
}
我在方法代码中做的唯一一件事就是填充这个对象,在我试图获取的代码段中:public List<DeviceItem> DeviceDataItems { get; set; } 是问题所在,因为我在没有它的情况下测试了该方法并且工作正常。此 DeviceItem 列表具有继承 Device Item 类的对象:
DeviceItemPanel : DeviceItem
DeviceItemPanelPartition : DeviceItem
DeviceItemDimmable : DeviceItem
DeviceItemThermostat : DeviceItem
etc..
我的问题:服务架构是否有任何限制来返回我上面解释的对象类? 因为当我执行该方法时它仍然处于加载状态,几秒钟后我收到消息:ERR_CONNECTION_RESET,我没有看到任何其他错误代码或其他任何内容,我还调试了该方法,一切正常问题是当它尝试以 JSON 格式返回对象时。 如果有人可以帮助我找到解决方案,我将不胜感激。 注意这个webservice方法的代码:
public ResultDeviceData GetDeviceData(string User, string Password, string DeviceNumber)
{
ResultDeviceData result = new ResultDeviceData();
try
{
Identity identity = GetUserIdentityPrivate(User, Password);
DeviceInfo info = GetDeviceInfoByNumber(User, Password, DeviceNumber);
string url = "https://" + info.DeviceInfoServerRelay + "/relay/relay/relay/device/" + info.DeviceNumber + "/port_3480/data_request?id=lu_sdata&output_format=json";
string jsonResult = Request_Get(url, null, null, info.DeviceInfoServerRelayToken);
//Read Json
var obj = JObject.Parse(jsonResult);
DeviceData data = new DeviceData();
data.DeviceDataFull = (int)obj.SelectToken("full");
data.DeviceDataVersion = (string)obj.SelectToken("version");
data.DeviceDataModel = (string)obj.SelectToken("model");
data.DeviceDataZWave_Heal = (int)obj.SelectToken("zwave_heal");
data.DeviceDataTemperature = (string)obj.SelectToken("temperature");
data.DeviceDataSkin = (string)obj.SelectToken("skin");
data.DeviceDataSerial_Number = (string)obj.SelectToken("serial_number");
data.DeviceDataFWD1 = (string)obj.SelectToken("fwd1");
data.DeviceDataFWD1Token = Request_Get("https://" + data.DeviceDataFWD1 + "/info/session/token", identity.IdentityFirm, identity.IdentitySignature, null);
data.DeviceDataFWD2 = (string)obj.SelectToken("fwd2");
data.DeviceDataFWD2Token = Request_Get("https://" + data.DeviceDataFWD2 + "/info/session/token", identity.IdentityFirm, identity.IdentitySignature, null);
data.DeviceDataMode = (int)obj.SelectToken("mode");
data.DeviceDataIr = (int)obj.SelectToken("ir");
data.DeviceDataIrtx = (string)obj.SelectToken("irtx");
data.DeviceDataLoadTime = (int)obj.SelectToken("loadtime");
data.DeviceDataState = (int)obj.SelectToken("state");
data.DeviceDataComment = (string)obj.SelectToken("comment");
data.DeviceDataSections = new List<Section>();
data.DeviceDataRooms = new List<Room>();
data.DeviceDataScenes = new List<Scene>();
data.DeviceDataCategories = new List<Category>();
data.DeviceDataItems = new List<DeviceItem>();
//Loading Sections
var sections = JArray.Parse(obj.SelectToken("sections").ToString());
for (int i = 0; i < sections.Count; i++)
{
Section section = new Section();
section.SectionId = (int)sections[i].SelectToken("id");
section.SectionName = (string)sections[i].SelectToken("name");
data.DeviceDataSections.Add(section);
}
//Loading Rooms
var rooms = JArray.Parse(obj.SelectToken("rooms").ToString());
for (int i = 0; i < rooms.Count; i++)
{
Room room = new Room();
room.RoomId = (int)rooms[i].SelectToken("id");
room.RoomName = (string)rooms[i].SelectToken("name");
room.SectionId = (int)rooms[i].SelectToken("section");
data.DeviceDataRooms.Add(room);
}
//Loading Scenes
var scenes = JArray.Parse(obj.SelectToken("scenes").ToString());
for (int i = 0; i < scenes.Count; i++)
{
Scene scene = new Scene();
scene.SceneId = (int)scenes[i].SelectToken("id");
scene.SceneName = (string)scenes[i].SelectToken("name");
scene.RoomId = (int)scenes[i].SelectToken("room");
scene.SceneActive = ((int)scenes[i].SelectToken("active")) != 0;
data.DeviceDataScenes.Add(scene);
}
//Loading Categories
var categories = JArray.Parse(obj.SelectToken("categories").ToString());
for (int i = 0; i < categories.Count; i++)
{
Category category = new Category();
category.CategoryId = (int)categories[i].SelectToken("id");
category.CategoryName = (string)categories[i].SelectToken("name");
data.DeviceDataCategories.Add(category);
}
//Loading Devices
var deviceItems = JArray.Parse(obj.SelectToken("devices").ToString());
for (int i = 0; i < deviceItems.Count; i++)
{
int DeviceItemId = (int)deviceItems[i].SelectToken("id");
string DeviceItemAltId = (string)deviceItems[i].SelectToken("altid");
string DeviceItemName = (string)deviceItems[i].SelectToken("name");
int RoomId = (int)deviceItems[i].SelectToken("room");
int CategoryId = (int)deviceItems[i].SelectToken("category");
int SubCategoryId = (int)deviceItems[i].SelectToken("subcategory");
int DeviceItemParent = (int)deviceItems[i].SelectToken("parent");
switch (CategoryId)
{
case 1:
{
break;
}
case 2:
{
DeviceItemDimmable dimmable = new DeviceItemDimmable();
dimmable.DeviceItemId = DeviceItemId;
dimmable.DeviceItemAltId = DeviceItemAltId;
dimmable.DeviceItemName = DeviceItemName;
dimmable.RoomId = RoomId;
dimmable.CategoryId = CategoryId;
dimmable.SubCategoryId = 0;
dimmable.DeviceItemParent = DeviceItemParent;
dimmable.DeviceItemDimmableStatus = (string)deviceItems[i].SelectToken("status");
dimmable.DeviceItemDimmableLevel = (string)deviceItems[i].SelectToken("level");
dimmable.DeviceItemDimmableState = (int)deviceItems[i].SelectToken("state");
dimmable.DeviceItemDimmableComment = (string)deviceItems[i].SelectToken("comment");
data.DeviceDataItems.Add(dimmable);
break;
}
case 3:
{
break;
}
case 4:
{
break;
}
case 5:
{
switch (SubCategoryId)
{
case 1:
{
DeviceItemThermostat thermostat = new DeviceItemThermostat();
thermostat.DeviceItemId = DeviceItemId;
thermostat.DeviceItemAltId = DeviceItemAltId;
thermostat.DeviceItemName = DeviceItemName;
thermostat.RoomId = RoomId;
thermostat.CategoryId = CategoryId;
thermostat.SubCategoryId = 0;
thermostat.DeviceItemParent = DeviceItemParent;
thermostat.DeviceItemThermostatFanMode = (string)deviceItems[i].SelectToken("fanmode");
thermostat.DeviceItemThermostatHvacState = (string)deviceItems[i].SelectToken("hvacstate");
thermostat.DeviceItemThermostatMode = (string)deviceItems[i].SelectToken("mode");
thermostat.DeviceItemThermostatSetPoint = (string)deviceItems[i].SelectToken("setpoint");
thermostat.DeviceItemThermostatHeat = (string)deviceItems[i].SelectToken("heat");
thermostat.DeviceItemThermostatCool = (string)deviceItems[i].SelectToken("cool");
thermostat.DeviceItemThermostatStatus = (string)deviceItems[i].SelectToken("status");
thermostat.DeviceItemThermostatBatteryLevel = (string)deviceItems[i].SelectToken("batterylevel");
thermostat.DeviceItemThermostatTemperature = (string)deviceItems[i].SelectToken("temperature");
thermostat.DeviceItemThermostatState = (int)deviceItems[i].SelectToken("state");
thermostat.DeviceItemThermostatComment = (string)deviceItems[i].SelectToken("comment");
data.DeviceDataItems.Add(thermostat);
break;
}
case 2:
{
break;
}
case 3:
{
break;
}
default:
break;
}
break;
}
case 6:
{
DeviceItemCamera camera = new DeviceItemCamera();
camera.DeviceItemId = DeviceItemId;
camera.DeviceItemAltId = DeviceItemAltId;
camera.DeviceItemName = DeviceItemName;
camera.RoomId = RoomId;
camera.CategoryId = CategoryId;
camera.SubCategoryId = 0;
camera.DeviceItemParent = DeviceItemParent;
camera.DeviceItemCameraIP = (string)deviceItems[i].SelectToken("ip");
camera.DeviceItemCameraURL = (string)deviceItems[i].SelectToken("url");
camera.DeviceItemCameraStreamming = (string)deviceItems[i].SelectToken("streaming");
camera.DeviceItemCameraVideoUrl = (string)deviceItems[i].SelectToken("videourls");
camera.DeviceItemCameraCommands = ((string)deviceItems[i].SelectToken("commands")).Split(',');
data.DeviceDataItems.Add(camera);
break;
}
case 22:
{
DeviceItemPanel panel = new DeviceItemPanel();
panel.DeviceItemId = DeviceItemId;
panel.DeviceItemAltId = DeviceItemAltId;
panel.DeviceItemName = DeviceItemName;
panel.RoomId = RoomId;
panel.CategoryId = CategoryId;
panel.SubCategoryId = 0;
panel.DeviceItemParent = DeviceItemParent;
data.DeviceDataItems.Add(panel);
break;
}
case 23:
{
DeviceItemPanelPartition panelPartition = new DeviceItemPanelPartition();
panelPartition.DeviceItemId = DeviceItemId;
panelPartition.DeviceItemAltId = DeviceItemAltId;
panelPartition.DeviceItemName = DeviceItemName;
panelPartition.RoomId = RoomId;
panelPartition.CategoryId = CategoryId;
panelPartition.SubCategoryId = 0;
panelPartition.DeviceItemParent = DeviceItemParent;
panelPartition.DeviceItemPanelPartitionAlarm = (string)deviceItems[i].SelectToken("alarm");
panelPartition.DeviceItemPanelPartitionAlarmMemory = (string)deviceItems[i].SelectToken("alarmmemory");
panelPartition.DeviceItemPanelPartitionArmMode = (string)deviceItems[i].SelectToken("armmode");
panelPartition.DeviceItemPanelPartitionDetailedArmMode = (string)deviceItems[i].SelectToken("detailedarmmode");
data.DeviceDataItems.Add(panelPartition);
break;
}
default:
{
}
break;
}
}
result.ResultMessage = "Data Retrieve";
result.ResultObject = data;
result.ResultValue = true;
}
catch (Exception e)
{
result.ResultMessage = e.Message;
result.ResultObject = null;
result.ResultValue = false;
}
return result;
}
【问题讨论】:
-
thre 可能会超时...可能需要花费日志时间从外部服务获取数据...建议引发故障异常,以便为您提供适当的信息
-
非常感谢,你知道我是这么想的,但最后我不认为这是问题所在,因为在调试器中该方法实际上工作得非常快,并且仅在方法执行后发生代码返回。
-
@PranayRana 我认为问题在于服务隐式将对象转换为Json的序列化,您怎么看?有没有相关的配置?
标签: c# web-services wcf